Am I supposed to call EntityManager.clear() often

2019-02-16 23:31发布

问题:

I'm new to JPA/OpenJPA and I noticed that if I don't call EntityManager.clear() after i persist entities I get an OutOfMemoryError (I keep adding new entities in a loop). I'm not sure if this is the expected behavior or it's just and OpenJPA 1.2.1 glitch.

So, am I required to explicitly detach the entities myself? If I'm not, it's a good practice anyway?

回答1:

I don't have much experience with JPA. However this'll be useful -
In JPA you must either:
- Create a new EntityManager for each transaction.
- Call clear() after each transaction to clear the persistence context.



回答2:

Depends how many objects you bring into the persistence process (read). If you handle large numbers (or some of the objects are large) then use of clear() can make sense. Each time an object is read it should be put in the L1 cache by the JPA impl.



回答3:

It sounds like there is something wrong somewhere, in your design. Usually, the entity gets detached once it is outside the scope of entity manager. And thats one of the reason you can't lazy load relations, outside the scope.

As far as my experience is concerned, I seldom used em.clear(), if ever. I used Hibernate implementation, and Toplink Essentials. No experience with OpenJPA, yet.