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