@Override public void addEventListeners(SessionEventListener... listeners) { getEventListenerManager().addListener( listeners ); }
@Override public Session openSession() { log.tracef( "Opening Hibernate Session. tenant=%s, owner=%s", tenantIdentifier, sessionOwner ); final SessionImpl session = new SessionImpl( sessionFactory, this ); for ( SessionEventListener listener : listeners ) { session.getEventListenerManager().addListener( listener ); } return session; }
@Test @TestForIssue( jiraKey = "HHH-3930" ) public void testEagerFetchBidirectionalOneToOneWithDirectFetching() { inTransaction( session -> { EntityA a = new EntityA( 1L, new EntityB( 2L ) ); session.persist( a ); session.flush(); session.clear(); // Use atomic integer because we need something mutable final AtomicInteger queryExecutionCount = new AtomicInteger(); session.getEventListenerManager().addListener( new StatisticalLoggingSessionEventListener() { @Override public void jdbcExecuteStatementStart() { super.jdbcExecuteStatementStart(); queryExecutionCount.getAndIncrement(); } } ); session.find( EntityA.class, 1L ); assertEquals( "Join fetching inverse one-to-one didn't use the object already present in the result set!", 1, queryExecutionCount.get() ); } ); }
@Test @TestForIssue( jiraKey = "HHH-3930" ) public void testFetchBidirectionalOneToOneWithOneJoinFetch() { inTransaction( session -> { EntityA a = new EntityA( 1L, new EntityB( 2L ) ); session.persist( a ); session.flush(); session.clear(); // Use atomic integer because we need something mutable final AtomicInteger queryExecutionCount = new AtomicInteger(); session.getEventListenerManager().addListener( new StatisticalLoggingSessionEventListener() { @Override public void jdbcExecuteStatementStart() { super.jdbcExecuteStatementStart(); queryExecutionCount.getAndIncrement(); } } ); session.createQuery( "from EntityA a join fetch a.b" ).list(); assertEquals( "Join fetching inverse one-to-one didn't use the object already present in the result set!", 1, queryExecutionCount.get() ); } ); }
@Test @TestForIssue( jiraKey = "HHH-3930" ) public void testFetchBidirectionalOneToOneWithCircularJoinFetch() { inTransaction( session -> { EntityA a = new EntityA( 1L, new EntityB( 2L ) ); session.persist( a ); session.flush(); session.clear(); // Use atomic integer because we need something mutable final AtomicInteger queryExecutionCount = new AtomicInteger(); session.getEventListenerManager().addListener( new StatisticalLoggingSessionEventListener() { @Override public void jdbcExecuteStatementStart() { super.jdbcExecuteStatementStart(); queryExecutionCount.getAndIncrement(); } } ); session.createQuery( "from EntityA a join fetch a.b b join fetch b.a" ).list(); assertEquals( "Join fetching inverse one-to-one didn't use the object already present in the result set!", 1, queryExecutionCount.get() ); } ); }
@Override public void addEventListeners(SessionEventListener... listeners) { getEventListenerManager().addListener( listeners ); }
@Override public Session openSession() { log.tracef( "Opening Hibernate Session. tenant=%s, owner=%s", tenantIdentifier, sessionOwner ); final SessionImpl session = new SessionImpl( sessionFactory, this ); for ( SessionEventListener listener : listeners ) { session.getEventListenerManager().addListener( listener ); } return session; }
/** * @param sessionImplementor A Hibernate session * * @return The {@link HibernateOrmSearchManager} to use within the context of the given session. */ @SuppressWarnings("unchecked") public HibernateOrmSearchManager getSearchManager(SessionImplementor sessionImplementor) { TransientReference<HibernateOrmSearchManager> reference = (TransientReference<HibernateOrmSearchManager>) sessionImplementor.getProperties().get( SEARCH_MANAGER_KEY ); HibernateOrmSearchManager searchManager = reference == null ? null : reference.get(); if ( searchManager == null ) { searchManager = getMapping().createSearchManager( sessionImplementor ); reference = new TransientReference<>( searchManager ); sessionImplementor.setProperty( SEARCH_MANAGER_KEY, reference ); // Make sure we will ultimately close the query manager sessionImplementor.getEventListenerManager().addListener( new SearchManagerClosingListener( sessionImplementor ) ); } return searchManager; }