1414
1515import org .hibernate .LockMode ;
1616import org .hibernate .Session ;
17+ import org .hibernate .StaleObjectStateException ;
1718import org .hibernate .boot .registry .StandardServiceRegistryBuilder ;
1819import org .hibernate .cfg .AvailableSettings ;
1920import org .hibernate .community .dialect .AltibaseDialect ;
2223import org .hibernate .dialect .SQLServerDialect ;
2324import org .hibernate .dialect .SybaseASEDialect ;
2425import org .hibernate .dialect .SybaseDialect ;
26+ import org .hibernate .dialect .lock .OptimisticEntityLockException ;
2527import org .hibernate .engine .spi .SharedSessionContractImplementor ;
2628import org .hibernate .query .criteria .HibernateCriteriaBuilder ;
2729import org .hibernate .query .criteria .JpaCriteriaQuery ;
4345import static org .hibernate .testing .transaction .TransactionUtil .doInHibernate ;
4446import static org .junit .jupiter .api .Assertions .assertEquals ;
4547import static org .junit .jupiter .api .Assertions .assertNotNull ;
48+ import static org .junit .jupiter .api .Assertions .assertThrows ;
4649import static org .junit .jupiter .api .Assertions .fail ;
4750
4851/**
5659public class LockModeTest extends BaseSessionFactoryFunctionalTest {
5760
5861 private Long id ;
62+ private Long cid ;
5963
6064 @ Override
6165 protected Class <?>[] getAnnotatedClasses () {
62- return new Class [] { A .class };
66+ return new Class [] { A .class , C . class };
6367 }
6468
6569 @ Override
@@ -79,6 +83,9 @@ public void prepareTest() throws Exception {
7983 A a = new A ( "it" );
8084 session .persist ( a );
8185 id = a .getId ();
86+ C c = new C ( "it" );
87+ session .persist ( c );
88+ cid = c .getId ();
8289 } );
8390 }
8491
@@ -263,6 +270,88 @@ public void testRefreshWithExplicitHigherLevelLockMode2() {
263270 } );
264271 }
265272
273+ @ Test
274+ @ JiraKey (value = "HHH-19937" )
275+ public void testRefreshWithOptimisticExplicitHigherLevelLockMode () {
276+ doInHibernate ( this ::sessionFactory , session -> {
277+ C c = session .find ( C .class , id );
278+ checkLockMode ( c , LockMode .READ , session );
279+ session .refresh ( c , LockModeType .OPTIMISTIC );
280+ checkLockMode ( c , LockMode .OPTIMISTIC , session );
281+ session .refresh ( c );
282+ checkLockMode ( c , LockMode .OPTIMISTIC , session );
283+ } );
284+ doInHibernate ( this ::sessionFactory , session -> {
285+ C c = session .find ( C .class , id );
286+ checkLockMode ( c , LockMode .READ , session );
287+ session .refresh ( c , LockModeType .OPTIMISTIC );
288+ checkLockMode ( c , LockMode .OPTIMISTIC , session );
289+ session .refresh ( c , LockMode .OPTIMISTIC_FORCE_INCREMENT );
290+ checkLockMode ( c , LockMode .OPTIMISTIC_FORCE_INCREMENT , session );
291+ } );
292+ doInHibernate ( this ::sessionFactory , session -> {
293+ C c = session .find ( C .class , id );
294+ checkLockMode ( c , LockMode .READ , session );
295+ session .refresh ( c , LockModeType .OPTIMISTIC_FORCE_INCREMENT );
296+ checkLockMode ( c , LockMode .OPTIMISTIC_FORCE_INCREMENT , session );
297+ session .refresh ( c );
298+ checkLockMode ( c , LockMode .OPTIMISTIC_FORCE_INCREMENT , session );
299+ } );
300+ }
301+
302+ @ Test
303+ @ JiraKey (value = "HHH-19937" )
304+ public void testRefreshWithOptimisticLockRefresh () {
305+ doInHibernate ( this ::sessionFactory , session -> {
306+ C c = session .find ( C .class , id , LockModeType .OPTIMISTIC );
307+ doInHibernate ( this ::sessionFactory , s -> {
308+ s .find ( C .class , id ).setValue ( "new value" );
309+ } );
310+ session .refresh ( c );
311+ } );
312+ }
313+
314+ @ Test
315+ @ JiraKey (value = "HHH-19937" )
316+ public void testRefreshWithOptimisticForceIncrementLockRefresh () {
317+ doInHibernate ( this ::sessionFactory , session -> {
318+ C c = session .find ( C .class , id , LockModeType .OPTIMISTIC_FORCE_INCREMENT );
319+ doInHibernate ( this ::sessionFactory , s -> {
320+ s .find ( C .class , id ).setValue ( "new value" );
321+ } );
322+ session .refresh ( c );
323+ } );
324+ }
325+
326+ @ Test
327+ @ JiraKey (value = "HHH-19937" )
328+ public void testRefreshWithOptimisticLockFailure () {
329+ assertThrows ( OptimisticEntityLockException .class , () ->
330+ doInHibernate ( this ::sessionFactory , session -> {
331+ C c = session .find ( C .class , id , LockModeType .OPTIMISTIC );
332+ session .refresh ( c );
333+ doInHibernate ( this ::sessionFactory , s -> {
334+ s .find ( C .class , id ).setValue ( "new value" );
335+ } );
336+ } )
337+ );
338+ }
339+
340+ @ Test
341+ @ JiraKey (value = "HHH-19937" )
342+ public void testRefreshWithOptimisticForceIncrementLockFailure () {
343+ // TODO: shouldn't this also be an OptimisticEntityLockException
344+ assertThrows ( StaleObjectStateException .class , () ->
345+ doInHibernate ( this ::sessionFactory , session -> {
346+ C c = session .find ( C .class , id , LockModeType .OPTIMISTIC_FORCE_INCREMENT );
347+ session .refresh ( c );
348+ doInHibernate ( this ::sessionFactory , s -> {
349+ s .find ( C .class , id ).setValue ( "new value" );
350+ } );
351+ } )
352+ );
353+ }
354+
266355 @ Test
267356 @ JiraKey (value = "HHH-12257" )
268357 public void testRefreshAfterUpdate () {
0 commit comments