Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中持久化具有两个多对一双向依赖项的实体?_Java_Hibernate_Jpa_Many To One - Fatal编程技术网

Java 如何在Hibernate中持久化具有两个多对一双向依赖项的实体?

Java 如何在Hibernate中持久化具有两个多对一双向依赖项的实体?,java,hibernate,jpa,many-to-one,Java,Hibernate,Jpa,Many To One,我在数据库中有以下关系实体: Table A <-- (One-to-Many) --> Table B Table B <-- (One-to-Many) --> Table C Table B <-- (Many-to-One) --> Table J Table C <-- (Many-to-One) --> Table J 当我执行代码时,我得到以下错误: **Unexpected error occurred in scheduled

我在数据库中有以下关系实体:

Table A <-- (One-to-Many) --> Table B
Table B <-- (One-to-Many) --> Table C
Table B <-- (Many-to-One) --> Table J
Table C <-- (Many-to-One) --> Table J
当我执行代码时,我得到以下错误:

**Unexpected error occurred in scheduled task.: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object TableB.tableJTableB -> class TableJ; nested exception in java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: TableB.tableJTableB -> class TableJ

Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: TableB.tableJTableB -> class TableJ**
有人能告诉我问题是什么吗?

问题是:

首先,插入一个。然后,在B中使用A_ID作为FK。插入B。B也需要J_ID FK,但J尚未存储=瞬态

应该更改JPA创建插入的顺序。需要J_ID来创建B,C。在将J添加到B,C之前将其持久化

for (TableB b : bList) {
  TableJ j = new TableJ();
  em.persist(j)
  j.addTableB(b);
  tableA.addTableB(b);
}

还有另一个循环

您是否建议我在第一次
for(TableB:bList)
迭代期间对
j的
persist()
save()
执行
for(TableB:bList)
操作,然后插入tableA实体(在第二次迭代期间对TableC的操作也是一样)?我是否可以连同所有关联的实体(包括
TableJ的
)一起构建我的tableA对象,然后在最后迭代所有
TableB的
TableC的
关联的
TableJ
属性,并将它们逐个插入,然后插入
tableA
,哪个应该触发插入
TableB
TableC
?我不完全确定你的第一句话是否正确。如果我从
TableB
中完全取出
Set
引用,并且只执行
for
循环的第一个
,它将插入
TableJ的
。当我将
TableC
引入
TableB
TableJ
时,问题就出现了。为什么?应该更改JPA提供程序创建插入的顺序。创建B,C需要J_ID。在将J添加到B,C之前将其持久化。当您从B中取出Set时,可能会改变插入的顺序。只是猜测而已。SQL语句日志会告诉我们更多。
**Unexpected error occurred in scheduled task.: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object TableB.tableJTableB -> class TableJ; nested exception in java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: TableB.tableJTableB -> class TableJ

Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: TableB.tableJTableB -> class TableJ**
for (TableB b : bList) {
  TableJ j = new TableJ();
  em.persist(j)
  j.addTableB(b);
  tableA.addTableB(b);
}