Hibernate多对多关系会创建不必要的唯一约束

时间:2016-10-06 14:06:18

标签: java hibernate orm

一天中的好时光!我在使用Hibernate创建多对多关系时遇到了一些问题。它在连接表中创建唯一约束:

  

“uk_bapa98k9j6y66sqniad6k680l”UNIQUE CONSTRAINT,btree(users_id)

所以我在这个表中只有一行特定用户,尝试插入另一行同一个user_id导致错误:

  

错误org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 错误:重复键值违反唯一约束“uk_bapa98k9j6y66sqniad6k680l”     Подробности:Key(users_id)=(1)已经存在

如何禁止Hibernate在此表中添加唯一约束?

@Entity
@Table(name="Projects", schema="public")
public class Project implements Serializable {
...
    @Id
    @GenericGenerator(name="increment", strategy="org.hibernate.id.IncrementGenerator")
    @GeneratedValue(generator="increment")
    @Column(name="project_id")
    public Long getId() {
        return this.id;
    }
...
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="project_users", joinColumns=@JoinColumn(name="projects_id"), inverseJoinColumns=@JoinColumn(name="users_id"))
    @ElementCollection(targetClass=User.class)
    public Set<User> getUsers()
    {
        return users;
    }


@Entity
@Table(name="Users")

public class User implements Serializable {
...
    @Id
    @GenericGenerator(name="increment", strategy="org.hibernate.id.IncrementGenerator")
    @GeneratedValue(generator="increment")
    @Column(name="user_id")
    public Long getId() {
        return this.id;
    }
...
    @ManyToMany(mappedBy="users")
    public Set<Project> getProjects()
    {
        return projects;
    }

2 个答案:

答案 0 :(得分:0)

使用@Id注释实体字段时,Id必须是唯一的。因此,无论您的多对多关系如何,USERS.user_id都应具有Unicity约束。

答案 1 :(得分:0)

您不应将@ElementCollection用于实体集合,它用于收集可嵌入或简单类型。