1
package org.hibernate.test.idgen.enhanced;
3
import java.util.Properties;
5
import junit.framework.Test;
6
import junit.framework.TestSuite;
8
import org.hibernate.junit.UnitTestCase;
9
import org.hibernate.dialect.Dialect;
10
import org.hibernate.id.enhanced.SequenceStyleGenerator;
11
import org.hibernate.id.enhanced.SequenceStructure;
12
import org.hibernate.id.enhanced.OptimizerFactory;
13
import org.hibernate.id.enhanced.TableStructure;
14
import org.hibernate.Hibernate;
15
import org.hibernate.MappingException;
18
* Tests that SequenceStyleGenerator configures itself as expected
19
* in various scenarios
21
* @author Steve Ebersole
23
public class SequenceStyleConfigUnitTest extends UnitTestCase {
24
public SequenceStyleConfigUnitTest(String string) {
28
public static Test suite() {
29
return new TestSuite( SequenceStyleConfigUnitTest.class );
33
* Test all params defaulted with a dialect supporting sequences
35
public void testDefaultedSequenceBackedConfiguration() {
36
Dialect dialect = new SequenceDialect();
37
Properties props = new Properties();
38
SequenceStyleGenerator generator = new SequenceStyleGenerator();
39
generator.configure( Hibernate.LONG, props, dialect );
41
assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() );
42
assertClassAssignability( OptimizerFactory.NoopOptimizer.class, generator.getOptimizer().getClass() );
43
assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() );
47
* Test all params defaulted with a dialect which does not support sequences
49
public void testDefaultedTableBackedConfiguration() {
50
Dialect dialect = new TableDialect();
51
Properties props = new Properties();
52
SequenceStyleGenerator generator = new SequenceStyleGenerator();
53
generator.configure( Hibernate.LONG, props, dialect );
55
assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() );
56
assertClassAssignability( OptimizerFactory.NoopOptimizer.class, generator.getOptimizer().getClass() );
57
assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() );
61
* Test default optimizer selection for sequence backed generators
62
* based on the configured increment size; both in the case of the
63
* dialect supporting pooled sequences (pooled) and not (hilo)
65
public void testDefaultOptimizerBasedOnIncrementBackedBySequence() {
66
Properties props = new Properties();
67
props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "10" );
69
// for dialects which do not support pooled sequences, we default to hilo
70
Dialect dialect = new SequenceDialect();
71
SequenceStyleGenerator generator = new SequenceStyleGenerator();
72
generator.configure( Hibernate.LONG, props, dialect );
73
assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() );
74
assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
75
assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() );
77
// for dialects which do support pooled sequences, we default to pooled
78
dialect = new PooledSequenceDialect();
79
generator = new SequenceStyleGenerator();
80
generator.configure( Hibernate.LONG, props, dialect );
81
assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() );
82
assertClassAssignability( OptimizerFactory.PooledOptimizer.class, generator.getOptimizer().getClass() );
83
assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() );
87
* Test default optimizer selection for table backed generators
88
* based on the configured increment size. Here we always prefer
91
public void testDefaultOptimizerBasedOnIncrementBackedByTable() {
92
Properties props = new Properties();
93
props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "10" );
94
Dialect dialect = new TableDialect();
95
SequenceStyleGenerator generator = new SequenceStyleGenerator();
96
generator.configure( Hibernate.LONG, props, dialect );
97
assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() );
98
assertClassAssignability( OptimizerFactory.PooledOptimizer.class, generator.getOptimizer().getClass() );
99
assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() );
103
* Test forcing of table as backing strucuture with dialect supporting sequences
105
public void testForceTableUse() {
106
Dialect dialect = new SequenceDialect();
107
Properties props = new Properties();
108
props.setProperty( SequenceStyleGenerator.FORCE_TBL_PARAM, "true" );
109
SequenceStyleGenerator generator = new SequenceStyleGenerator();
110
generator.configure( Hibernate.LONG, props, dialect );
111
assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() );
112
assertClassAssignability( OptimizerFactory.NoopOptimizer.class, generator.getOptimizer().getClass() );
113
assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() );
117
* Test explicitly specifying both optimizer and increment
119
public void testExplicitOptimizerWithExplicitIncrementSize() {
120
// with sequence ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121
Dialect dialect = new SequenceDialect();
123
// optimizer=none w/ increment > 1 => should honor optimizer
124
Properties props = new Properties();
125
props.setProperty( SequenceStyleGenerator.OPT_PARAM, OptimizerFactory.NONE );
126
props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "20" );
127
SequenceStyleGenerator generator = new SequenceStyleGenerator();
128
generator.configure( Hibernate.LONG, props, dialect );
129
assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() );
130
assertClassAssignability( OptimizerFactory.NoopOptimizer.class, generator.getOptimizer().getClass() );
131
assertEquals( 1, generator.getOptimizer().getIncrementSize() );
132
assertEquals( 1, generator.getDatabaseStructure().getIncrementSize() );
134
// optimizer=hilo w/ increment > 1 => hilo
135
props = new Properties();
136
props.setProperty( SequenceStyleGenerator.OPT_PARAM, OptimizerFactory.HILO );
137
props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "20" );generator = new SequenceStyleGenerator();
138
generator.configure( Hibernate.LONG, props, dialect );
139
assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() );
140
assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
141
assertEquals( 20, generator.getOptimizer().getIncrementSize() );
142
assertEquals( 20, generator.getDatabaseStructure().getIncrementSize() );
144
// optimizer=pooled w/ increment > 1 => hilo
145
props = new Properties();
146
props.setProperty( SequenceStyleGenerator.OPT_PARAM, OptimizerFactory.POOL );
147
props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "20" );
148
generator = new SequenceStyleGenerator();
149
generator.configure( Hibernate.LONG, props, dialect );
150
assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() );
151
assertClassAssignability( OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass() );
152
assertEquals( 20, generator.getOptimizer().getIncrementSize() );
153
assertEquals( 20, generator.getDatabaseStructure().getIncrementSize() );
156
private static class TableDialect extends Dialect {
157
public boolean supportsSequences() {
162
private static class SequenceDialect extends Dialect {
163
public boolean supportsSequences() {
166
public boolean supportsPooledSequences() {
169
public String getSequenceNextValString(String sequenceName) throws MappingException {
174
private static class PooledSequenceDialect extends SequenceDialect {
175
public boolean supportsPooledSequences() {