/** * Apply the follow-on-locking hint. * * @param followOnLocking The follow-on-locking strategy. */ protected boolean applyFollowOnLockingHint(Boolean followOnLocking) { getLockOptions().setFollowOnLocking( followOnLocking ); return true; }
private LockOptions determineLockOptions(LockModeType lockModeType, Integer lockTimeoutHint, Boolean followOnLocking) { LockOptions lockOptions = new LockOptions( LockModeConverter.convertToLockMode( lockModeType ) ) .setFollowOnLocking( followOnLocking ); if ( lockTimeoutHint != null ) { lockOptions.setTimeOut( lockTimeoutHint ); } return lockOptions; }
/** * Perform a shallow copy. * * @param source Source for the copy (copied from) * @param destination Destination for the copy (copied to) * * @return destination */ public static LockOptions copy(LockOptions source, LockOptions destination) { destination.setLockMode( source.getLockMode() ); destination.setScope( source.getScope() ); destination.setTimeOut( source.getTimeOut() ); if ( source.aliasSpecificLockModes != null ) { destination.aliasSpecificLockModes = new HashMap<String,LockMode>( source.aliasSpecificLockModes ); } destination.setFollowOnLocking( source.getFollowOnLocking() ); return destination; } }
@Override @SuppressWarnings("unchecked") public QueryImplementor setLockOptions(LockOptions lockOptions) { this.lockOptions.setLockMode( lockOptions.getLockMode() ); this.lockOptions.setScope( lockOptions.getScope() ); this.lockOptions.setTimeOut( lockOptions.getTimeOut() ); this.lockOptions.setFollowOnLocking( lockOptions.getFollowOnLocking() ); return this; }
@Override protected void applySkipLocked(Query query) { query.setLockOptions( new LockOptions( lockMode() ).setFollowOnLocking( false ) ); }
@Test public void testPessimisticLockWithCountDistinctThenFollowOnLocking() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); List<Product> products = session.createQuery( "select p from Product p where ( select count(distinct p1.id) from Product p1 ) > 0 ", Product.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ).setFollowOnLocking( false ) ) .getResultList(); assertEquals( 50, products.size() ); assertEquals( 1, sqlStatementInterceptor.getSqlQueries().size() ); session.getTransaction().commit(); session.close(); }
@Test public void testPessimisticLockWithGroupByWhileExplicitlyEnablingFollowOnLockingThenFollowOnLocking() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); List<Object[]> products = session.createQuery( "select count(p), p " + "from Product p " + "group by p.id, p.name " ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( true ) ) .getResultList(); assertEquals( 50, products.size() ); assertEquals( 51, sqlStatementInterceptor.getSqlQueries().size() ); session.getTransaction().commit(); session.close(); }
@Test public void testPessimisticLockWithMaxResultsAndOrderByWhileExplicitlyEnablingFollowOnLockingThenFollowOnLocking() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); List<Product> products = session.createQuery( "select p from Product p order by p.id", Product.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( true ) ) .setMaxResults( 10 ) .getResultList(); assertEquals( 10, products.size() ); assertEquals( 11, sqlStatementInterceptor.getSqlQueries().size() ); session.getTransaction().commit(); session.close(); }
@Test public void testPessimisticLockWithDistinctWhileExplicitlyEnablingFollowOnLockingThenFollowOnLocking() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); List<Product> products = session.createQuery( "select distinct p from Product p where p.id > 40" ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( true ) ) .setMaxResults( 10 ) .getResultList(); assertEquals( 10, products.size() ); assertEquals( 11, sqlStatementInterceptor.getSqlQueries().size() ); session.getTransaction().commit(); session.close(); }
@Test public void testPessimisticLockWithFirstResultsWhileExplicitlyEnablingFollowOnLockingThenFollowOnLocking() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); List<Product> products = session.createQuery( "select p from Product p", Product.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( true ) ) .setFirstResult( 40 ) .setMaxResults( 10 ) .getResultList(); assertEquals( 10, products.size() ); assertEquals( 11, sqlStatementInterceptor.getSqlQueries().size() ); session.getTransaction().commit(); session.close(); }
@Test public void testPessimisticLockWithUnionWhileExplicitlyDisablingFollowOnLockingThenFails() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); try { List<Vehicle> vehicles = session.createQuery( "select v from Vehicle v" ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ).setFollowOnLocking( false ) ) .getResultList(); fail( "Should throw exception since Oracle does not support UNION if follow on locking is disabled" ); } catch ( PersistenceException expected ) { assertEquals( SQLGrammarException.class, expected.getCause().getClass() ); } }
@Test public void testPessimisticLockWithGroupByWhileExplicitlyDisablingFollowOnLockingThenFails() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); try { List<Object[]> products = session.createQuery( "select count(p), p " + "from Product p " + "group by p.id, p.name " ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( false ) ) .getResultList(); fail( "Should throw exception since Oracle does not support GROUP BY if follow on locking is disabled" ); } catch ( PersistenceException expected ) { assertEquals( SQLGrammarException.class, expected.getCause().getClass() ); } }
.setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( false ) ) .getResultList();
@Test public void testPessimisticLockWithDistinctWhileExplicitlyDisablingFollowOnLockingThenFails() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); try { List<Product> products = session.createQuery( "select distinct p from Product p where p.id > 40", Product.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( false ) ) .getResultList(); fail( "Should throw exception since Oracle does not support DISTINCT if follow on locking is disabled" ); } catch ( PersistenceException expected ) { assertEquals( SQLGrammarException.class, expected.getCause().getClass() ); } }
@Test public void testPessimisticLockWithMaxResultsAndOrderByWhileExplicitlyDisablingFollowOnLockingThenFails() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); try { List<Product> products = session.createQuery( "select p from Product p order by p.id", Product.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( false ) ) .setMaxResults( 10 ) .getResultList(); fail( "Should throw exception since Oracle does not support ORDER BY if follow on locking is disabled" ); } catch ( PersistenceException expected ) { assertEquals( SQLGrammarException.class, expected.getCause().getClass() ); } }
@Test public void testPessimisticLockWithFirstResultsWhileExplicitlyDisablingFollowOnLockingThenFails() { final Session session = openSession(); session.beginTransaction(); sqlStatementInterceptor.getSqlQueries().clear(); try { List<Product> products = session.createQuery( "select p from Product p", Product.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setFollowOnLocking( false ) ) .setFirstResult( 40 ) .setMaxResults( 10 ) .getResultList(); fail( "Should throw exception since Oracle does not support ORDER BY if follow on locking is disabled" ); } catch ( PersistenceException expected ) { assertEquals( SQLGrammarException.class, expected.getCause().getClass() ); } }
@Override public void cascade( EventSource session, Object child, String entityName, Object anything, boolean isCascadeDeleteEnabled) { LOG.tracev( "Cascading to lock: {0}", entityName ); LockMode lockMode = LockMode.NONE; LockOptions lr = new LockOptions(); if ( anything instanceof LockOptions ) { LockOptions lockOptions = (LockOptions) anything; lr.setTimeOut( lockOptions.getTimeOut() ); lr.setScope( lockOptions.getScope() ); lr.setFollowOnLocking( lockOptions.getFollowOnLocking() ); if ( lockOptions.getScope() ) { lockMode = lockOptions.getLockMode(); } } lr.setLockMode( lockMode ); session.buildLockRequest( lr ).lock( entityName, child ); }
/** * Apply the follow-on-locking hint. * * @param followOnLocking The follow-on-locking strategy. */ protected boolean applyFollowOnLockingHint(Boolean followOnLocking) { getLockOptions().setFollowOnLocking( followOnLocking ); return true; }
private LockOptions determineLockOptions(LockModeType lockModeType, Integer lockTimeoutHint, Boolean followOnLocking) { LockOptions lockOptions = new LockOptions( LockModeConverter.convertToLockMode( lockModeType ) ) .setFollowOnLocking( followOnLocking ); if ( lockTimeoutHint != null ) { lockOptions.setTimeOut( lockTimeoutHint ); } return lockOptions; }
@Override @SuppressWarnings("unchecked") public QueryImplementor setLockOptions(LockOptions lockOptions) { getQueryOptions().getLockOptions().setLockMode( lockOptions.getLockMode() ); getQueryOptions().getLockOptions().setScope( lockOptions.getScope() ); getQueryOptions().getLockOptions().setTimeOut( lockOptions.getTimeOut() ); getQueryOptions().getLockOptions().setFollowOnLocking( lockOptions.getFollowOnLocking() ); return this; }