在开发我的 Java EE 应用程序时,我遇到了两种情况,即我的实体过早地在数据库中创建;它们是在插入引用的行之前插入的,导致违反外键。
起初我以为我弄错了,以错误的顺序在数据库中创建行。
但不,事实并非如此。然后我开始认为我的 JPA 提供程序* 中存在错误,或者他们只是弄错了。
但后来我意识到 EntityManager 不知道表之间的连接。
让我解释一下:
在两种情况下,表 A 都使用外键引用表 B。
情况#1:
My code:
1. Creates an entity of table B.
2. Creates a row of table A using JDBC (there's no entity for table A).
JPA provider:
1. Runs the JDBC first (inserts a row into table A).
2. SQLException is thrown, because B isn't created yet.
为什么要使用 JDBC?
因为这不是我的代码。
情况#2:
My code:
1. Creates an entity of table B.
2. Creates an entity of table A. The thing is, A only holds B's ID.
JPA provider:
1. Creates entity A.
2. SQLException is thrown, because B isn't created yet.
为什么B没有A作为成员?
因为 B 里面有一个大的 blob,它需要很多内存,我想尽量减少对 B 对象的引用。
我需要一个解决方案。也许有办法告诉 EntityManager 按照我调用它的顺序运行 SQL。
在厕所里,我也想过在创建实体 B 后使用“flush”,但我现在无法测试它,因为我们的开发数据库因维护而停机(DBA 正在发挥他们的魔力)。
* 我正在使用 Oracle WebLogic 12.1.1.0 附带的 TopLink。