Skip to content

Commit 6076711

Browse files
gavinkingmbellade
authored andcommitted
add test for lock modes
(cherry picked from commit 50440e0)
1 parent 51aa1e7 commit 6076711

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.locking;
6+
7+
import jakarta.persistence.Cacheable;
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.Id;
10+
import org.hibernate.LockMode;
11+
import org.hibernate.ObjectDeletedException;
12+
import org.hibernate.testing.orm.junit.DomainModel;
13+
import org.hibernate.testing.orm.junit.SessionFactory;
14+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
15+
import org.junit.jupiter.api.Test;
16+
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.assertThrows;
19+
20+
@SessionFactory
21+
@DomainModel(annotatedClasses = LockModeAcrossTransactionsTest.Cached.class)
22+
class LockModeAcrossTransactionsTest {
23+
24+
@Test void testWithEvict(SessionFactoryScope scope) {
25+
scope.inTransaction( session -> {
26+
session.persist( new Cached(5L) );
27+
} );
28+
scope.getSessionFactory().getCache().evict(Cached.class);
29+
scope.inSession( session -> {
30+
Cached cached = session.find( Cached.class, 5L );
31+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
32+
} );
33+
scope.getSessionFactory().getCache().evict(Cached.class);
34+
scope.inTransaction( session -> {
35+
Cached cached = session.find( Cached.class, 5L );
36+
assertEquals( LockMode.READ, session.getCurrentLockMode( cached ) );
37+
} );
38+
scope.getSessionFactory().getCache().evict(Cached.class);
39+
scope.inSession( session -> {
40+
Cached cached = session.createQuery( "from Cached", Cached.class ).getSingleResult();
41+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
42+
} );
43+
scope.getSessionFactory().getCache().evict(Cached.class);
44+
scope.inTransaction( session -> {
45+
Cached cached = session.createQuery( "from Cached", Cached.class ).getSingleResult();
46+
assertEquals( LockMode.READ, session.getCurrentLockMode( cached ) );
47+
} );
48+
scope.getSessionFactory().getCache().evict(Cached.class);
49+
scope.inSession( session -> {
50+
Cached cached = session.fromTransaction( tx -> {
51+
Cached c = session.find( Cached.class, 5L );
52+
assertEquals( LockMode.READ, session.getCurrentLockMode( c ) );
53+
return c;
54+
} );
55+
session.inTransaction( tx -> {
56+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
57+
} );
58+
} );
59+
scope.inSession( session -> {
60+
Cached cached = session.find( Cached.class, 5L );
61+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
62+
} );
63+
scope.inTransaction( session -> {
64+
Cached cached = session.find( Cached.class, 5L );
65+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
66+
} );
67+
}
68+
69+
@Test void testWithoutEvict(SessionFactoryScope scope) {
70+
scope.inTransaction( session -> {
71+
Cached cached = new Cached( 3L );
72+
session.persist( cached );
73+
assertEquals( LockMode.WRITE, session.getCurrentLockMode( cached ) );
74+
} );
75+
scope.inSession( session -> {
76+
Cached cached = session.find( Cached.class, 3L );
77+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
78+
} );
79+
scope.inTransaction( session -> {
80+
Cached cached = session.find( Cached.class, 3L );
81+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
82+
cached.name = "Gavin";
83+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
84+
session.flush();
85+
assertEquals( LockMode.WRITE, session.getCurrentLockMode( cached ) );
86+
} );
87+
scope.inTransaction( session -> {
88+
Cached cached = session.find( Cached.class, 3L );
89+
assertEquals( LockMode.NONE, session.getCurrentLockMode( cached ) );
90+
session.remove( cached );
91+
assertThrows( ObjectDeletedException.class,
92+
() -> session.getCurrentLockMode( cached ) );
93+
} );
94+
}
95+
96+
@Cacheable @Entity(name = "Cached")
97+
static class Cached {
98+
@Id
99+
Long id;
100+
String name;
101+
Cached(Long id) {
102+
this.id = id;
103+
}
104+
Cached() {
105+
}
106+
}
107+
}

0 commit comments

Comments
 (0)