java - Hibernate级联子对象不在查找表中存储父表的ID

标签 java mysql entity-framework hibernate jpa

我有一个表 A 和表 C。A - C 之间的关系是 1 - *,因此我有一个查找表 B。 B 存储 A 的 'id' 和 'C' 的 'id'。

实体:

Class A {
   @OneToMany(mappedBy = "A", cascade = CascadeType.ALL)
   private List<B> b;
}

Class B {
   @ManyToOne
   private A a;

   @OneToOne(cascade = CascadeType.ALL)
   @JoinColumn(name = "id")
   private C c;
}

Class C {
   @OneToOne(mappedBy = "c")
   private B b;
}

我在A类和B类中定义了CASCADE ALL,这意味着当我持久化A类的实体时,我想持久化B类的所有实体,而当我持久化B类的实体时,我想持久化类B的所有实体C.

保存操作:

A a = new A();
B b = someMethodToGetB(); 
A.setB(B);
save(A);

someMethodToGetB() {
C c = new C();
b.setC(c);
return b;
}

问题: 所有条目均在表“C”中进行。 所有条目均在表“A”中进行。 但表“B”(查找表)中的所有条目的“A”类 ID 均为空。

CASCADE 的保存操作如何进行?就我而言,我首先希望在表 C 和 A 中添加条目。对于每个条目,查找表中都应该有一个条目。这是否可以使用 CASCADE 以某种方式实现,或者我是否需要手动为 A 和 C 创建实体,然后获取 ID 并保存在 B 中?

任何人都可以指出我做错了什么或遗漏了什么吗?

最佳答案

I have defined CASCADE ALL in class A and class B, which means that when I persist an entity of class A I want to persist all entities of class B AND when I persist an entity of class B I want to persist all entities of class C.

Hibernate 不以这种方式工作。 持久化时,如果您持久化关系的所有者实体,则应用级联持久化关系。
在您的情况下,根据您使用的 mappedby 值,所有者是 B。
因此,您应该根据需要保留 B 并设置所有关系。

A a = new A();
B b = someMethodToGetB(); 
A.setB(B);
save(A);

someMethodToGetB() {
  C c = new C();
  b.setC(c);
  return b;
}

应该是:

B b = someMethodToGetB(); 
A a = new A();  
b.setA(a);
save(b);

someMethodToGetB() {
  B b = new B();
  C c = new C();
  b.setC(c);
  return b;
}

我已经更正了您的伪代码中的拼写错误。

关于java - Hibernate级联子对象不在查找表中存储父表的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41432438/

相关文章:

java - 捕获无法送达或垃圾邮件文件夹电子邮件

java - hibernate选择新对象构造函数

asp.net-mvc - ASP.NET MVC - 从 SQL Server Express 切换到精简版 - 连接问题

performance - LINQ 内存不足错误

c# - 使用数据库拦截器的 Entity Framework 软删除实现不起作用

java - 尝试使用 Libgdx 创建一个简单的垂直组

java - Hibernate @ManyToMany 在插入的拥有端插入 0

mysql - PHP - 通知 : Undefined index:

mysql - 如何在 CakePHP 中生成 MySQL IS NOT NULL 条件?

php - 下载过程中 Apache2 服务器/网站停止响应