Hibernate,级联操作,重复

时间:2015-08-07 13:42:54

标签: java mysql hibernate

我有2个表Person和Address与中间表Person_Address之间的多对多关系。我为这些实体提供了Daos和服务

我想要的是当一个人添加地址列表时,如果数据库系统中已经存在的地址应该只是将这些地址的id添加到Person_Address表中。

具有不同ID的重复值会发生什么。

这样做的可能方法是在添加之前检查数据库但如果我这样做那么我将编写自己的SQL查询而不是hibernate。有没有办法让我在hibernate中实现我的目标?

人类

@Entity
@Table(name = "PERSON")
public class Person {

    @Id
    @Column(name = "personID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String surName;
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "PERSON_ADDRESS", joinColumns = {
        @JoinColumn(name = "PERSONID")}, inverseJoinColumns = {
        @JoinColumn(name = "ADDRESSID")})
    private List<Address> addresses = new ArrayList<>();

地址类

@Entity
@Table(name = "ADDRESS")
public class Address {

    @Id
    @Column(name = "addressID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "addresses")
    private List<Person> residents;
    private String street;
    private String state;
    private String country;
    private String postCode;

2 个答案:

答案 0 :(得分:0)

也许一个解决方案可以是更改数据库并将完整地址设置为主键,您可以通过连接其他字段来获取它。为了确保地址相同,我认为您必须将其格式化为较低或大写。 因此,当您将地址放入时,它将成为主键,您将不会有重复的数据。

答案 1 :(得分:0)

如果实体没有身份证明。 Hibernate以不同的方式创建它。

您应该在前端使用地址预填充。或者使用Criteria API在保存之前搜索输入的地址