一对多关系违反唯一约束
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;
...
}
人物实体看起来像这样
@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>();
...
}
在我的测试中,我只是先创建一个城市并保存它。然后创建一个人并在保存该人之前在其上添加保存的城市实例。救人后,一切安好。
当我添加第二个人并在第二个人身上添加同一个城市时,它引发了唯一约束冲突。我不确定为什么会这样,因为在关系 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);
}
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
之间存在多对多关系没有意义
我有一个 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>();
...
}
在我的测试中,我只是先创建一个城市并保存它。然后创建一个人并在保存该人之前在其上添加保存的城市实例。救人后,一切安好。
当我添加第二个人并在第二个人身上添加同一个城市时,它引发了唯一约束冲突。我不确定为什么会这样,因为在关系 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);
}
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
之间存在多对多关系没有意义