JPA - 一对多 - 重复键值错误

时间:2017-12-05 14:09:01

标签: java postgresql hibernate jpa

我需要为具有2列INSERT INTO USERS_CONTACTS(user_id, contact_id) VALUES(1, 5); INSERT INTO USERS_CONTACTS(user_id, contact_id) VALUES(5, 1);

的用户实现连接表

我需要存储用户的联系人列表。我需要使id为1的用户可以拥有id为5的联系人用户,但是用户5也可以拥有id为1的联系人用户(但他不是)。

我需要做以下插入:

@Entity
public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", columnDefinition = "serial")
    private long id;

    @OneToMany
    @JoinTable(name = "USERS_CONTACTS",
            joinColumns = @JoinColumn(name = "USER_ID"),
            inverseJoinColumns = @JoinColumn(name = "CONTACT_ID"))
    private List<User> contacts;

   // ...
}

现在我收到了这个错误:

  

不成功:INSERT INTO USERS_CONTACTS(user_id,contact_id)   价值观(2,3)2017-12-05 15:00:15.146错误14268 --- [主要]   org.hibernate.tool.hbm2ddl.SchemaExport:错误:重复键值   违反了唯一约束“uk_j9ggomsdbjte1eqfo5e61vh8a”

以下是我在JPA中用户的关系实现:

spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

你能告诉我如何解决它吗?我正在使用Postgre 9.5。感谢。

修改

对于hibernate,我有以下属性:

int

3 个答案:

答案 0 :(得分:1)

尝试自己解决此问题。

  1. 启用Hibernate SQL日志
  2. 在测试数据库(表空间)或使用H2数据库上使用Hibernate创建数据库模式。您可以使用单元测试下载此项目并使用映射进行播放:https://github.com/v-ladynev/hibernate-experimental
  3. 检查生成的SQL。
  4. 也许,您会注意到contact_iduk_j9ggomsdbjte1eqfo5e61vh8a约束而变得独一无二。原因是对于@OneToMany关系,孩子必须只有一个父母。

    我认为你需要@ManyToMany关系。

答案 1 :(得分:0)

我认为uk_j9ggomsdbjte1eqfo5e61vh8a是以前版本的遗留物。

如果是这样,那么只需删除约束:

alter table USERS_CONTACTS drop constraint uk_j9ggomsdbjte1eqfo5e61vh8a;

答案 2 :(得分:-1)

该表上一定不能有唯一索引!删除该索引,它应该工作。