6
6
*/
7
7
package org .hibernate .id ;
8
8
9
- import java .sql .Connection ;
10
- import java .sql .PreparedStatement ;
11
- import java .sql .ResultSet ;
12
- import java .sql .SQLException ;
13
- import java .util .Collections ;
14
9
import java .util .Properties ;
15
10
16
11
import org .hibernate .Session ;
12
+ import org .hibernate .Transaction ;
17
13
import org .hibernate .boot .Metadata ;
18
14
import org .hibernate .boot .MetadataSources ;
19
- import org .hibernate .boot .model .naming .Identifier ;
20
15
import org .hibernate .boot .model .naming .ObjectNameNormalizer ;
21
- import org .hibernate .boot .model .relational .SimpleAuxiliaryDatabaseObject ;
22
16
import org .hibernate .boot .registry .StandardServiceRegistry ;
23
17
import org .hibernate .boot .registry .StandardServiceRegistryBuilder ;
24
18
import org .hibernate .boot .spi .MetadataBuildingContext ;
25
19
import org .hibernate .cfg .AvailableSettings ;
26
- import org .hibernate .engine .jdbc .env .spi .JdbcEnvironment ;
27
- import org .hibernate .engine .jdbc .spi .JdbcServices ;
28
20
import org .hibernate .engine .spi .SessionFactoryImplementor ;
29
21
import org .hibernate .engine .spi .SessionImplementor ;
30
22
import org .hibernate .id .enhanced .SequenceStyleGenerator ;
31
23
import org .hibernate .internal .SessionImpl ;
32
- import org .hibernate .jdbc .Work ;
33
24
import org .hibernate .type .StandardBasicTypes ;
34
25
35
- import org .hibernate .testing .DialectChecks ;
36
- import org .hibernate .testing .RequiresDialectFeature ;
37
- import org .hibernate .testing .env .TestingDatabaseInfo ;
38
- import org .hibernate .testing .junit4 .BaseUnitTestCase ;
39
- import org .hibernate .testing .boot .BasicTestingJdbcServiceImpl ;
40
- import org .hibernate .testing .boot .MetadataBuildingContextTestingImpl ;
41
26
import org .junit .After ;
42
27
import org .junit .Before ;
43
28
import org .junit .Test ;
44
29
30
+ import org .hibernate .testing .DialectChecks ;
31
+ import org .hibernate .testing .RequiresDialectFeature ;
32
+ import org .hibernate .testing .boot .MetadataBuildingContextTestingImpl ;
33
+ import org .hibernate .testing .junit4 .BaseUnitTestCase ;
34
+
45
35
import static org .junit .Assert .assertEquals ;
46
36
47
37
/**
50
40
*
51
41
* @author Steve Ebersole
52
42
*/
53
- @ SuppressWarnings ({ "deprecation" })
54
- @ RequiresDialectFeature ( DialectChecks .SupportsSequences .class )
43
+ @ SuppressWarnings ({"deprecation" })
44
+ @ RequiresDialectFeature (DialectChecks .SupportsSequences .class )
55
45
public class SequenceHiLoGeneratorNoIncrementTest extends BaseUnitTestCase {
56
46
private static final String TEST_SEQUENCE = "test_sequence" ;
57
47
58
48
private StandardServiceRegistry serviceRegistry ;
59
49
private SessionFactoryImplementor sessionFactory ;
60
50
private SequenceStyleGenerator generator ;
61
- private SessionImplementor session ;
51
+ private SessionImplementor sessionImpl ;
52
+ private SequenceValueExtractor sequenceValueExtractor ;
62
53
63
54
@ Before
64
55
public void setUp () throws Exception {
65
- BasicTestingJdbcServiceImpl jdbcServices = new BasicTestingJdbcServiceImpl ();
66
- jdbcServices .prepare ( false );
67
-
68
56
serviceRegistry = new StandardServiceRegistryBuilder ()
69
57
.enableAutoClose ()
70
- .addService ( JdbcEnvironment .class , jdbcServices .getJdbcEnvironment () )
71
- .addService ( JdbcServices .class , jdbcServices )
72
58
.applySetting ( AvailableSettings .HBM2DDL_AUTO , "create-drop" )
73
59
.build ();
74
60
@@ -94,13 +80,14 @@ protected MetadataBuildingContext getBuildingContext() {
94
80
generator .registerExportables ( metadata .getDatabase () );
95
81
96
82
sessionFactory = (SessionFactoryImplementor ) metadata .buildSessionFactory ();
83
+ sequenceValueExtractor = new SequenceValueExtractor ( sessionFactory .getDialect (), TEST_SEQUENCE );
97
84
}
98
85
99
86
@ After
100
87
public void tearDown () throws Exception {
101
- if ( session != null && !session .isClosed ()) {
102
- ((Session )session ).close ();
103
- }
88
+ if ( sessionImpl != null && !sessionImpl .isClosed () ) {
89
+ ((Session ) sessionImpl ).close ();
90
+ }
104
91
if ( sessionFactory != null ) {
105
92
sessionFactory .close ();
106
93
}
@@ -111,58 +98,49 @@ public void tearDown() throws Exception {
111
98
112
99
@ Test
113
100
public void testHiLoAlgorithm () {
114
- session = (SessionImpl ) sessionFactory .openSession ();
115
- ((Session )session ).beginTransaction ();
101
+ sessionImpl = (SessionImpl ) sessionFactory .openSession ();
116
102
117
103
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118
104
// initially sequence should be uninitialized
119
- assertEquals ( 0L , extractSequenceValue ( (session ) ) );
105
+ assertEquals ( 0L , extractSequenceValue ( (sessionImpl ) ) );
106
+
120
107
121
108
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122
109
// historically the hilo generators skipped the initial block of values;
123
110
// so the first generated id value is maxlo + 1, here be 4
124
- Long generatedValue = ( Long ) generator . generate ( session , null );
125
- assertEquals ( 1L , generatedValue . longValue () );
111
+ assertEquals ( 1L , generateValue () );
112
+
126
113
// which should also perform the first read on the sequence which should set it to its "start with" value (1)
127
- assertEquals ( 1L , extractSequenceValue ( (session ) ) );
114
+ assertEquals ( 1L , extractSequenceValue ( (sessionImpl ) ) );
128
115
129
116
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130
- generatedValue = (Long ) generator .generate ( session , null );
131
- assertEquals ( 2L , generatedValue .longValue () );
132
- assertEquals ( 2L , extractSequenceValue ( (session ) ) );
117
+ assertEquals ( 2L , generateValue () );
118
+ assertEquals ( 2L , extractSequenceValue ( (sessionImpl ) ) );
133
119
134
120
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
135
- generatedValue = (Long ) generator .generate ( session , null );
136
- assertEquals ( 3L , generatedValue .longValue () );
137
- assertEquals ( 3L , extractSequenceValue ( (session ) ) );
121
+ assertEquals ( 3L , generateValue () );
122
+ assertEquals ( 3L , extractSequenceValue ( (sessionImpl ) ) );
138
123
139
124
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
140
- generatedValue = (Long ) generator .generate ( session , null );
141
- assertEquals ( 4L , generatedValue .longValue () );
142
- assertEquals ( 4L , extractSequenceValue ( (session ) ) );
125
+ assertEquals ( 4L , generateValue () );
126
+ assertEquals ( 4L , extractSequenceValue ( (sessionImpl ) ) );
143
127
144
128
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
145
- generatedValue = (Long ) generator .generate ( session , null );
146
- assertEquals ( 5L , generatedValue .longValue () );
147
- assertEquals ( 5L , extractSequenceValue ( (session ) ) );
129
+ assertEquals ( 5L , generateValue () );
130
+ assertEquals ( 5L , extractSequenceValue ( (sessionImpl ) ) );
148
131
149
- ((Session )session ).getTransaction ().commit ();
150
- ((Session )session ).close ();
132
+ ((Session ) sessionImpl ).close ();
151
133
}
152
134
153
- private long extractSequenceValue (final SessionImplementor session ) {
154
- class WorkImpl implements Work {
155
- private long value ;
156
- public void execute (Connection connection ) throws SQLException {
157
-
158
- PreparedStatement query = session .getJdbcCoordinator ().getStatementPreparer ().prepareStatement ( "select currval('" + TEST_SEQUENCE + "');" );
159
- ResultSet resultSet = session .getJdbcCoordinator ().getResultSetReturn ().extract ( query );
160
- resultSet .next ();
161
- value = resultSet .getLong ( 1 );
162
- }
163
- }
164
- WorkImpl work = new WorkImpl ();
165
- ( (Session ) session ).doWork ( work );
166
- return work .value ;
135
+ private long extractSequenceValue (SessionImplementor sessionImpl ) {
136
+ return sequenceValueExtractor .extractSequenceValue ( sessionImpl );
137
+ }
138
+
139
+ private long generateValue () {
140
+ Long generatedValue ;
141
+ Transaction transaction = ((Session ) sessionImpl ).beginTransaction ();
142
+ generatedValue = (Long ) generator .generate ( sessionImpl , null );
143
+ transaction .commit ();
144
+ return generatedValue .longValue ();
167
145
}
168
146
}
0 commit comments