我有一个 City
实体和一个 Person
实体。我想设置一个从 Person 到 City 的 OneToMany
关系,指示一个人居住过哪些城市。它是一个来自 Person 的单向 OneToMany 关系。
我的城市类(class)看起来像这样
@Entity
public class City {
@Id
@GeneratedValue
private Long id;
private String name;
...
}
人实体看起来像这样
@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>();
...
}
在我的测试中,我只是先创建一个城市并保存它。然后创建一个人并在保存该人之前添加已保存的城市实例。救了人之后,一切就都好了。
当我添加第二个人并在第二个人上添加同一城市时,它会引发唯一约束违规。我不确定为什么会发生这种情况,因为在关系表中,这应该作为人员 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);
}
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/