private static boolean activeProxySession(HibernateProxy proxy) { final Session session = (Session) proxy.getHibernateLazyInitializer().getSession(); return session != null && session.isOpen() && session.isConnected(); }
private void setProxyReadOnly(HibernateProxy proxy, boolean readOnly) { if ( proxy.getHibernateLazyInitializer().getSession() != getSession() ) { throw new AssertionFailure( "Attempt to set a proxy to read-only that is associated with a different session" ); } proxy.getHibernateLazyInitializer().setReadOnly( readOnly ); }
/** * Associate a proxy that was instantiated by another session with this session * * @param li The proxy initializer. * @param proxy The proxy to reassociate. */ private void reassociateProxy(LazyInitializer li, HibernateProxy proxy) { if ( li.getSession() != this.getSession() ) { final EntityPersister persister = session.getFactory().getMetamodel().entityPersister( li.getEntityName() ); final EntityKey key = session.generateEntityKey( li.getIdentifier(), persister ); // any earlier proxy takes precedence proxiesByKey.putIfAbsent( key, proxy ); proxy.getHibernateLazyInitializer().setSession( session ); } }
public static Object getTargetFromProxy(SessionFactoryImplementor sessionFactoryImplementor, HibernateProxy proxy) { if ( !proxy.getHibernateLazyInitializer().isUninitialized() || activeProxySession( proxy ) ) { return proxy.getHibernateLazyInitializer().getImplementation(); } final SharedSessionContractImplementor sessionImplementor = proxy.getHibernateLazyInitializer().getSession(); final Session tempSession = sessionImplementor == null ? sessionFactoryImplementor.openTemporarySession() : sessionImplementor.getFactory().openTemporarySession(); try { return tempSession.get( proxy.getHibernateLazyInitializer().getEntityName(), proxy.getHibernateLazyInitializer().getIdentifier() ); } finally { tempSession.close(); } }
@Override public Serializable getIdentifier(Object object) throws HibernateException { checkOpen(); checkTransactionSynchStatus(); if ( object instanceof HibernateProxy ) { LazyInitializer li = ( (HibernateProxy) object ).getHibernateLazyInitializer(); if ( li.getSession() != this ) { throw new TransientObjectException( "The proxy was not associated with this session" ); } return li.getIdentifier(); } else { EntityEntry entry = persistenceContext.getEntry( object ); if ( entry == null ) { throw new TransientObjectException( "The instance was not associated with this session" ); } return entry.getId(); } }
return li.getSession() == this;
return li.getSession() == this;
@Test public void testIsReadOnlyAfterSessionClosedViaLazyInitializer() { DataPoint dpOrig = createDataPoint( CacheMode.IGNORE ); Session s = openSession(); s.setCacheMode(CacheMode.IGNORE); s.beginTransaction(); DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) ); assertTrue( dp instanceof HibernateProxy ); assertFalse( Hibernate.isInitialized( dp ) ); checkReadOnly( s, dp, false ); s.getTransaction().commit(); assertTrue( s.contains( dp ) ); s.close(); assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() ); try { ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnly(); fail( "should have failed because session was detached" ); } catch ( TransientObjectException ex) { // expected assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() ); } finally { s = openSession(); s.beginTransaction(); s.delete( dp ); s.getTransaction().commit(); s.close(); } }
@Test public void testSetReadOnlyAfterSessionClosedViaLazyInitializer() { DataPoint dpOrig = createDataPoint( CacheMode.IGNORE ); Session s = openSession(); s.setCacheMode(CacheMode.IGNORE); s.beginTransaction(); DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) ); assertTrue( dp instanceof HibernateProxy ); assertFalse( Hibernate.isInitialized( dp ) ); checkReadOnly( s, dp, false ); s.getTransaction().commit(); assertTrue( s.contains( dp ) ); s.close(); assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() ); try { ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().setReadOnly( true ); fail( "should have failed because session was detached" ); } catch ( TransientObjectException ex) { // expected assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() ); } finally { s = openSession(); s.beginTransaction(); s.delete( dp ); s.getTransaction().commit(); s.close(); } }
s.close(); assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() ); assertTrue( ( (SessionImplementor) s ).isClosed() ); try {
@Test public void testDetachedIsReadOnlyAfterEvictViaLazyInitializer() { DataPoint dpOrig = createDataPoint( CacheMode.IGNORE ); Session s = openSession(); s.setCacheMode(CacheMode.IGNORE); s.beginTransaction(); DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) ); assertTrue( dp instanceof HibernateProxy ); assertFalse( Hibernate.isInitialized( dp ) ); checkReadOnly( s, dp, false ); s.evict( dp ); assertFalse( s.contains( dp ) ); assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() ); try { ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnly(); fail( "should have failed because proxy was detached" ); } catch ( TransientObjectException ex) { // expected assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() ); } finally { s.delete( dp ); s.getTransaction().commit(); s.close(); } }
@Test public void testDetachedSetReadOnlyAfterEvictViaLazyInitializer() { DataPoint dpOrig = createDataPoint( CacheMode.IGNORE ); Session s = openSession(); s.setCacheMode(CacheMode.IGNORE); s.beginTransaction(); DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) ); assertTrue( dp instanceof HibernateProxy ); assertFalse( Hibernate.isInitialized( dp ) ); checkReadOnly( s, dp, false ); s.evict( dp ); assertFalse( s.contains( dp ) ); assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() ); try { ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().setReadOnly( true ); fail( "should have failed because proxy was detached" ); } catch ( TransientObjectException ex) { // expected assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() ); } finally { s.delete( dp ); s.getTransaction().commit(); s.close(); } }
@Test public void testDetachedSetReadOnlyAfterEvictViaSession() { DataPoint dpOrig = createDataPoint( CacheMode.IGNORE ); Session s = openSession(); s.setCacheMode(CacheMode.IGNORE); s.beginTransaction(); DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) ); assertTrue( dp instanceof HibernateProxy ); assertFalse( Hibernate.isInitialized( dp ) ); checkReadOnly( s, dp, false ); assertTrue( s.contains( dp ) ); s.evict( dp ); assertFalse( s.contains( dp ) ); assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() ); try { s.setReadOnly( dp, true ); fail( "should have failed because proxy was detached" ); } catch ( TransientObjectException ex) { // expected assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() ); } finally { s.delete( dp ); s.getTransaction().commit(); s.close(); } }
@Test public void testDetachedIsReadOnlyAfterEvictViaSession() { DataPoint dpOrig = createDataPoint( CacheMode.IGNORE ); Session s = openSession(); s.setCacheMode(CacheMode.IGNORE); s.beginTransaction(); DataPoint dp = ( DataPoint ) s.load( DataPoint.class, new Long( dpOrig.getId() ) ); assertTrue( dp instanceof HibernateProxy ); assertFalse( Hibernate.isInitialized( dp ) ); checkReadOnly( s, dp, false ); assertTrue( s.contains( dp ) ); s.evict( dp ); assertFalse( s.contains( dp ) ); assertNull( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().getSession() ); try { s.isReadOnly( dp ); fail( "should have failed because proxy was detached" ); } catch ( TransientObjectException ex) { // expected assertFalse( ( ( HibernateProxy ) dp ).getHibernateLazyInitializer().isReadOnlySettingAvailable() ); } finally { s.delete( dp ); s.getTransaction().commit(); s.close(); } }
private void checkProxyReadOnly(Session s, Object proxy, boolean expectedReadOnly) { assertTrue( proxy instanceof HibernateProxy ); LazyInitializer li = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer(); assertSame( s, li.getSession() ); assertEquals( expectedReadOnly, s.isReadOnly( proxy ) ); assertEquals( expectedReadOnly, li.isReadOnly() ); assertEquals( Hibernate.isInitialized( proxy ), ! li.isUninitialized() ); if ( Hibernate.isInitialized( proxy ) ) { assertEquals( expectedReadOnly, s.isReadOnly( li.getImplementation() ) ); } }
private void checkReadOnly(Session s, Object proxy, boolean expectedReadOnly) { assertTrue( proxy instanceof HibernateProxy ); LazyInitializer li = ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer(); assertSame( s, li.getSession() ); assertEquals( expectedReadOnly, s.isReadOnly( proxy ) ); assertEquals( expectedReadOnly, li.isReadOnly() ); assertEquals( Hibernate.isInitialized( proxy ), ! li.isUninitialized() ); if ( Hibernate.isInitialized( proxy ) ) { assertEquals( expectedReadOnly, s.isReadOnly( li.getImplementation() ) ); } } }
LazyInitializer li = ( (HibernateProxy) object ).getHibernateLazyInitializer(); if ( li.isUninitialized() ) { if ( li.getSession() == source ) { return; //NOTE EARLY EXIT!
@Override public boolean isLoadable() { if (this.value instanceof HibernateProxy) { HibernateProxy proxy = (HibernateProxy)this.value; return proxy.getHibernateLazyInitializer().getSession().isConnected(); } return true; }
@Override protected boolean isAbandonableElement(E element) { //This endpoint is not inverse means the opposite end point is inverse. if (!this.inverse && element instanceof HibernateProxy) { HibernateProxy proxy = (HibernateProxy)element; SessionImplementor session = proxy.getHibernateLazyInitializer().getSession(); return session == null || !session.isOpen() || !session.isConnected(); } return false; }
/** * Associate a proxy that was instantiated by another session with this session */ private void reassociateProxy(LazyInitializer li, HibernateProxy proxy) throws HibernateException { if ( li.getSession() != this ) { EntityPersister persister = session.getFactory().getEntityPersister( li.getEntityName() ); EntityKey key = new EntityKey( li.getIdentifier(), persister, session.getEntityMode() ); if ( !proxiesByKey.containsKey(key) ) proxiesByKey.put(key, proxy); // any earlier proxy takes precedence proxy.getHibernateLazyInitializer().setSession(session); } }