Roger Suen edited a comment on Bug HHH-6982

I have the same problem: trying to persist an entity with a reference to a detached, uninitialised proxy when an entity with the same id as the proxy exists in the current persistence context will cause a LazyInitializationException.

I have added a test to reproduce the issue. The test is simple as described by Martin. Here's the code:

@Test
public void test() { // prepare data em.getTransaction().begin(); User user = new User(1, "Roger", "Suen"); em.persist(user); Message message = new Message(1, "foo", "bar", user); em.persist(message); em.getTransaction().commit(); // start with an empty context em.clear(); Message entityMessage = em.find(Message.class, 1); User proxyUser = entityMessage.getUser(); assertNotNull(entityMessage); assertNotNull(proxyUser); assertFalse(emf.getPersistenceUnitUtil().isLoaded(proxyUser)); // make proxyUser a detached, uninitialized proxy. em.clear(); // load the User object with the same id into the context User entityUser = em.find(User.class, 1); assertNotNull(entityUser); // try to persist a new message with reference to the proxy em.getTransaction().begin(); Message transientMessage = new Message(2, "foo", "bar", proxyUser); // throw org.hibernate.LazyInitializationException: could not initialize proxy - no Session em.persist(transientMessage); em.getTransaction().commit(); }

The exception is as follow:

...
Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
at org.hibernate.engine.internal.ForeignKeys$Nullifier.isNullifiable(ForeignKeys.java:142)
at org.hibernate.engine.internal.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:94)
at org.hibernate.engine.internal.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:72)
at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:128)
at org.hibernate.action.internal.AbstractEntityInsertAction.makeEntityManaged(AbstractEntityInsertAction.java:139)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:209)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:136)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:328)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:136)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:818)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:822)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:865)

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira