HHH-7669 - Oracle sequences ordered
This commit is contained in:
parent
cbe1c77ad8
commit
363048f44a
|
@ -49,7 +49,7 @@ public class MetadataTools {
|
||||||
if (useRevisionEntityWithNativeId) {
|
if (useRevisionEntityWithNativeId) {
|
||||||
generator_mapping.addAttribute("class", "native");
|
generator_mapping.addAttribute("class", "native");
|
||||||
} else {
|
} else {
|
||||||
generator_mapping.addAttribute("class", "org.hibernate.id.enhanced.SequenceStyleGenerator");
|
generator_mapping.addAttribute("class", "org.hibernate.envers.enhanced.OrderedSequenceGenerator");
|
||||||
generator_mapping.addElement("param").addAttribute("name", "sequence_name").setText("REVISION_GENERATOR");
|
generator_mapping.addElement("param").addAttribute("name", "sequence_name").setText("REVISION_GENERATOR");
|
||||||
generator_mapping.addElement("param").addAttribute("name", "table_name").setText("REVISION_GENERATOR");
|
generator_mapping.addElement("param").addAttribute("name", "table_name").setText("REVISION_GENERATOR");
|
||||||
generator_mapping.addElement("param").addAttribute("name", "initial_value").setText("1");
|
generator_mapping.addElement("param").addAttribute("name", "initial_value").setText("1");
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.hibernate.envers.enhanced;
|
||||||
|
|
||||||
|
import org.hibernate.HibernateException;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.Oracle8iDialect;
|
||||||
|
import org.hibernate.id.enhanced.SequenceStyleGenerator;
|
||||||
|
import org.hibernate.internal.util.StringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revision number generator has to produce values in ascending order (gaps may occur).
|
||||||
|
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||||
|
*/
|
||||||
|
public class OrderedSequenceGenerator extends SequenceStyleGenerator {
|
||||||
|
@Override
|
||||||
|
public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
|
||||||
|
String[] create = super.sqlCreateStrings( dialect );
|
||||||
|
if ( dialect instanceof Oracle8iDialect ) {
|
||||||
|
// Make sure that sequence produces increasing values in Oracle RAC environment.
|
||||||
|
create = StringHelper.suffix( create, " order" );
|
||||||
|
}
|
||||||
|
return create;
|
||||||
|
}
|
||||||
|
}
|
|
@ -47,7 +47,7 @@ public class SequenceIdRevisionEntity implements Serializable {
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(generator = "RevisionNumberSequenceGenerator")
|
@GeneratedValue(generator = "RevisionNumberSequenceGenerator")
|
||||||
@GenericGenerator(name = "RevisionNumberSequenceGenerator",
|
@GenericGenerator(name = "RevisionNumberSequenceGenerator",
|
||||||
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
|
strategy = "org.hibernate.envers.enhanced.OrderedSequenceGenerator",
|
||||||
parameters = {@Parameter(name = "table_name", value = "REVISION_GENERATOR"),
|
parameters = {@Parameter(name = "table_name", value = "REVISION_GENERATOR"),
|
||||||
@Parameter(name = "sequence_name", value = "REVISION_GENERATOR"),
|
@Parameter(name = "sequence_name", value = "REVISION_GENERATOR"),
|
||||||
@Parameter(name = "initial_value", value = "1"),
|
@Parameter(name = "initial_value", value = "1"),
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package org.hibernate.envers.test.integration.reventity;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.Oracle8iDialect;
|
||||||
|
import org.hibernate.envers.enhanced.OrderedSequenceGenerator;
|
||||||
|
import org.hibernate.envers.enhanced.SequenceIdRevisionEntity;
|
||||||
|
import org.hibernate.envers.test.BaseEnversFunctionalTestCase;
|
||||||
|
import org.hibernate.envers.test.entities.StrIntTestEntity;
|
||||||
|
import org.hibernate.id.IdentifierGenerator;
|
||||||
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
|
import org.hibernate.testing.RequiresDialect;
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-7669")
|
||||||
|
@RequiresDialect(Oracle8iDialect.class)
|
||||||
|
public class MonotonicRevisionNumberTest extends BaseEnversFunctionalTestCase {
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[]{ StrIntTestEntity.class }; // Otherwise revision entity is not generated.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOracleSequenceOrder() {
|
||||||
|
EntityPersister persister = sessionFactory().getEntityPersister( SequenceIdRevisionEntity.class.getName() );
|
||||||
|
IdentifierGenerator generator = persister.getIdentifierGenerator();
|
||||||
|
Assert.assertTrue( OrderedSequenceGenerator.class.isInstance( generator ) );
|
||||||
|
OrderedSequenceGenerator seqGenerator = (OrderedSequenceGenerator) generator;
|
||||||
|
Assert.assertTrue(
|
||||||
|
"Oracle sequence needs to be ordered in RAC environment.",
|
||||||
|
seqGenerator.sqlCreateStrings( getDialect() )[0].endsWith( " order" )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue