当前位置: 首页 > 知识库问答 >
问题:

对OneTo多关系的独特禁忌违反

钦高峯
2023-03-14

我有一个City实体和一个Person实体。我想设置一个人到城市的关系,指示一个人曾经住在哪个城市。这是一种单向的一对多关系。

我的城市班是这样的

@Entity
public class City {

  @Id
  @GeneratedValue
  private Long id;

  private String name;
  ...
}

链接到城市等级代码

person实体如下所示

@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>();
   ...
}

链接到个人类别代码

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

当我添加第二个人并在第二个人身上添加相同的城市时,它会抛出一个唯一的约束冲突。我不知道为什么会发生这种情况,因为在关系表中,这应该作为person 2和city 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.026WARN 5473 --- [ 主]o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误: 23505, SQLState:23505 2015-07-02 18:11:21.026ERROR 5473 --- [ 主]o.h.engine.jdbc.spi.SqlExceptionHelper:唯一索引或主键冲突:"UK_B6XKGKBT91IXB0WE6N030RFPQ_INDEX_C公开。PERSON_LIVED_IN_CITIES(LIVED_IN_CITIES_ID)值(1,1)";SQL声明:

完整的项目可在https://github.com/adeelmahmood/jpatest-onetomany

我将感谢任何帮助。

共有1个答案

申思远
2023-03-14

问题是,当在Person类上使用@OneToMany注释时,您试图将两个人关联到同一个城市,您的意思是每个城市只关联到一个人。

可能的解决办法:

1-(最推荐)将@OneToMany注释移动到城市类。在类城市上实现一组人员,而不是在人员上设置一组城市。另外,在Person属性集上添加@OneToMany注释。

2-您可以简单地使用@ManyTo多项注释,并保持其余内容不变。这是不推荐的,因为在你的情况下,在人与城市之间进行多对多是没有意义的

 类似资料:
  • 我目前在数据库中的一对一/多对一映射时遇到问题。我希望我的图书表具有与“出版商”、“流派”、“评级”和“状态”表的@ManyToOne映射。 这是我的Book实体类的外观: 例如,我的Publisher实体类(类型、评级和状态类完全相同): 唯一的区别是类型、评级和状态的书籍字段,f. e: 这就是我的堆栈跟踪的样子: 更新的堆栈跟踪:

  • 问题内容: 在使用hibernate和MySQL的spring mvc应用程序中,我收到以下约束冲突异常: 当我尝试保存一个包含type的属性时,会出现问题,这两个属性都在下面定义。 我已经读过很多关于此错误的帖子和博客,但似乎没有一个可以解决我的问题。 如何解决此错误? 这是课程: 这是课程: 这是来自控制器的代码: 这是dao方法: 已执行的SQL语句和hibernate试图通过sql插入的实

  • 我还想知道如何定义每个模型上的关系--你是否需要或者是否可以只在用户上定义关系?

  • 问题内容: 伙计们,我正在努力为我的公司制作一个简单的票证生成系统,以吸引人。目前,我的MSSQL数据库中有一个名为的表,另一个名为的表。 我的应用程序是C#Windows窗体,因此在新的票证生成窗体上,我有许多文本框和一个用于分配工程师的comboBox,由填充。生成票证后,以这种形式输入的所有信息都将与from一起存储。 效果很好,但是后来我的客户要求我添加选项,以便可以在一张票上分配3名工程

  • 我有一个OneTo多项关系,我可以插入记录,但不能删除它们,当我试图删除它时,它会遇到“外键约束失败”错误。我使用级联删除孤儿如下,但不工作还。 父类的成员具有以下getter 成员类的父类具有以下getter 我也使用了下面的注释,但不起作用 我的冬眠依赖如下 我删除信息的代码