java - 一对多关系的唯一约束违规

标签 java spring jpa spring-data-jpa

我有一个 City 实体和一个 Person 实体。我想设置一个从 Person 到 City 的 OneToMany 关系,指示一个人居住过哪些城市。它是一个来自 Person 的单向 OneToMany 关系。

我的城市类(class)看起来像这样

@Entity
public class City {

  @Id
  @GeneratedValue
  private Long id;

  private String name;
  ...
}

link to City class code

人实体看起来像这样

@Entity
public class Person {

   @Id
   @GeneratedValue
   private Long id;

   private String name;

   @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true)
   private Set<City> livedInCities = new HashSet<City>();
   ...
}

link to Person class code

在我的测试中,我只是先创建一个城市并保存它。然后创建一个人并在保存该人之前添加已保存的城市实例。救了人之后,一切就都好了。

当我添加第二个人并在第二个人上添加同一城市时,它会引发唯一约束违规。我不确定为什么会发生这种情况,因为在关系表中,这应该作为人员 2 和城市 1 的新行插入。 测试代码

@Test
public void test() {

    City chicago = new City();
    chicago.setName("chicago");
    City savedChicago = cityRepo.save(chicago);

    Person john = new Person();
    john.setName("john");
    john.addCity(savedChicago);
    Person savedJohn = personRepo.save(john);

    Person tom = new Person();
    tom.setName("tom");
    tom.addCity(savedChicago);
    Person savedTom = personRepo.save(tom);

    System.out.println(savedTom);
    System.out.println(savedJohn);

}

link to Test code

2015-07-02 18:11:21.026 WARN 5473 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23505, SQLState: 23505 2015-07-02 18:11:21.026 ERROR 5473 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Unique index or primary key violation: "UK_B6XKGKBT91IXB0WE6N030RFPQ_INDEX_C ON PUBLIC.PERSON_LIVED_IN_CITIES(LIVED_IN_CITIES_ID) VALUES (1, 1)"; SQL statement:

完整的项目可在以下位置找到: https://github.com/adeelmahmood/jpatest-onetomany

如果有任何帮助,我将不胜感激。

最佳答案

问题是,当您在 Person 类上使用 @OneToMany 注释时,您试图将两个 Person 与同一个 City 相关联,您表示每个 City 只与一个 Person 相关。

可能的解决方案:

1 - (最推荐)将 @OneToMany 注释移至 City 类。不要在 Person 上实现一组城市,而是在类 City 上实现一组人。另外,在 Set of Person 属性上添加 @OneToMany 注释。

2 - 您可以简单地使用 @ManyToMany 注释并保留所有其余内容。不建议这样做,因为在您的情况下,在 Person 和 City 之间进行多对多是没有意义的

关于java - 一对多关系的唯一约束违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31196198/

相关文章:

java - 尝试在 Java 中的 Spark 数据集中添加列时出现空指针异常

java - Spring DATA JPA 以 Hibernate 作为 JPA 提供者

java - 更简洁的 Builder 模式?

java - 在 Joda-Time DateTime 中添加一天

java - 我可以在同一个服务中使用两个存储库吗?

带有分页 API 的 Spring RestTemplate

jakarta-ee - 检查JTA事务是否提交成功

java - MySQL 存储过程与 JPA 查询

java - 记录 Maven 依赖关系

java - 如何使用spring boot格式化json日期格式