一对多关系违反唯一约束

Unique contraint violation on OneToMany relationship

我有一个 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

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

当我添加第二个人并在第二个人身上添加同一个城市时,它引发了唯一约束冲突。我不确定为什么会这样,因为在关系 table 中,这应该作为人员 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

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

问题是,当您在人物上使用 @OneToMany 注释时,您正试图将两个人物与同一个城市联系起来 class 您说的是每个城市只与一个人相关。

可能的解决方案:

1 -(最推荐)将 @OneToMany 注释移动到城市 class。不是在人身上有一组城市,而是在 class 城市上实施一组人。此外,在 Set of Person 属性上添加 @OneToMany 注释。

2 - 您可以简单地使用@ManyToMany 注释,其余的保持原样。不推荐这样做,因为在您的情况下,Person 和 City

之间存在多对多关系没有意义