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);
}