我是 JPA/OpenJPA 的新手,我注意到如果我EntityManager.clear()
在持久化实体后不调用,我会得到一个OutOfMemoryError
(我不断在循环中添加新实体)。我不确定这是预期的行为还是仅仅是 OpenJPA 1.2.1 故障。
那么,我是否需要自己明确分离实体?如果我不是,无论如何这是一个好习惯?
我是 JPA/OpenJPA 的新手,我注意到如果我EntityManager.clear()
在持久化实体后不调用,我会得到一个OutOfMemoryError
(我不断在循环中添加新实体)。我不确定这是预期的行为还是仅仅是 OpenJPA 1.2.1 故障。
那么,我是否需要自己明确分离实体?如果我不是,无论如何这是一个好习惯?
我对JPA没有太多经验。但是这很有用 -
在 JPA 中,您必须:
- 为每个事务创建一个新的 EntityManager。
- 在每个事务之后调用 clear() 以清除持久性上下文。
取决于您将多少对象带入持久化过程(读取)。如果您处理大量数字(或某些对象很大),则使用 clear() 可能有意义。每次读取对象时,JPA impl 都应将其放入 L1 缓存中。
听起来您的设计中某处有问题。通常,一旦实体超出实体管理器的范围,实体就会被分离。这就是你不能在范围之外延迟加载关系的原因之一。
就我的经验而言,我很少使用 em.clear(),如果有的话。我使用了 Hibernate 实现和 Toplink Essentials。还没有使用 OpenJPA 的经验。