1

在开发我的 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。

4

2 回答 2

2

解决的好方法是在 A 和 B 之间建立关系。可以做些什么来提高效率:

如果由于某种原因无法完成,那么您应该在后续操作之前需要完成的每个操作之后刷新 entitymanager。

于 2012-05-13T13:12:14.817 回答
1

如果无法定义关系,可以使用 DescriptorCustomizer 并调用 API addConstraintDependency() 让 EclipseLink 知道约束,然后它将以正确的顺序发出 SQL。

于 2012-05-14T19:08:23.460 回答