首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Spring Hibernate JPA PostgreSQL避免保存重复行/记录

Java Spring Hibernate JPA PostgreSQL避免保存重复行/记录
EN

Stack Overflow用户
提问于 2021-09-29 16:38:06
回答 3查看 60关注 0票数 0

当涉及到数据库时,我是个新手。我觉得这可能是一个很常见的数据库问题,我似乎找不到正确的搜索词来找到我的答案。

我的问题是表中的“重复”行。我正在尝试将餐厅的食物菜单保存在一个数据库中,并且在很大程度上它工作得很好。我有一个名为RestaurantWeek的对象,它包含一个RestaurantDay对象列表,每天都包含一个RestaurantCourse对象列表。它们被保存在数据库中:image。"weeks_days“和"days_courses”表是"weeks“、"days”和"courses“表之间的链接。

现在,当许多天可以有相同的“课程”时,问题就来了。几乎每天都有"Salad“作为课程,所以最终发生的情况是,我的”课程“表中有12个相同的行,唯一的例外是id列:image。所以现在的问题是,我如何告诉JPA或Hibernate在我的"courses“表中使用现有的"Salad”行,而不是每次都插入一个新的行?有没有可能通过向我的对象或它们的属性添加一些特定的注释来做到这一点?

我曾尝试用@Column(unique=true)将"RestaurantCourse“上的" name”属性设置为unique,但随后我收到有关hibernate尝试以相同名称保存多个课程的错误(因为名称必须是唯一的)。在保存数据并多次使用相同的id时,我尝试了获取" courses“表,但是之后我得到了关于hibernate试图用相同的id保存多个课程的错误(因为id必须是唯一的)。

有没有可能“很容易”地修复这个问题,比如用几个我不知道的具体注解?关于如何将数据保存到数据库,我是否需要更改其他内容,例如类、注释或尝试保存的方式?

这是我的课程。

代码语言:javascript
复制
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(name="weeks")
public class RestaurantWeek {
    @Id
    private long id;
    private Date saveDate;
    private String weekName;
    @OneToMany(cascade = CascadeType.ALL)
    private List<RestaurantDay> days;
}

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(name="days")
public class RestaurantDay {
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;
    private String day;
    @OneToMany(cascade = CascadeType.ALL)
    private List<RestaurantCourse> courses;
}

@AllArgsConstructor
@NoArgsConstructor
@Data
@TypeDef(name = "list-array", typeClass = ListArrayType.class)
@Entity
@Table(name = "courses")
public class RestaurantCourse {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Column(unique = true)
    private String name;
    private String price;
    private String type;
    @Type(type = "list-array")
    @Column(name = "tags", columnDefinition = "text[]")
    private List<String> tags;
}

还有我用来保存的东西:

代码语言:javascript
复制
@Repository
public interface RestaurantMenuRepository extends JpaRepository<RestaurantWeek, Long> {
}

public class RestaurantMenuServiceImpl implements RestaurantMenuService {
    @Autowired
    private RestaurantMenuRepository restaurantMenuRepository;
    @Override
    public RestaurantWeek addNewWeek(RestaurantWeek restaurantWeek) {
        return this.restaurantMenuRepository.save(restaurantWeek);
    }
}

提前谢谢。

EN

Stack Overflow用户

发布于 2021-09-29 16:53:49

是可能的,您必须使用现有实体。但在此方法中使用公共RestaurantWeek addNewWeek(RestaurantWeek restaurantWeek)参数RestaurantWeek是不正确的,尝试将此方法中的一些数据放到带有需要字段的类中创建实体类,另外将该参数传递给可用的标识课程实体找到你可以做关系并添加到天实体中。不会每次都传递所有参数!

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69380359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档