Skip to content

Commit 35176b4

Browse files
committed
HHH-18983 add test for value generator implementing ExportableProducer
1 parent 47976e1 commit 35176b4

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.idgen.userdefined;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.EntityManagerFactory;
9+
import jakarta.persistence.GeneratedValue;
10+
import jakarta.persistence.Id;
11+
import org.hibernate.annotations.ValueGenerationType;
12+
import org.hibernate.boot.model.naming.Identifier;
13+
import org.hibernate.boot.model.relational.Database;
14+
import org.hibernate.boot.model.relational.ExportableProducer;
15+
import org.hibernate.boot.model.relational.Sequence;
16+
import org.hibernate.dialect.Dialect;
17+
import org.hibernate.dialect.MySQLDialect;
18+
import org.hibernate.dialect.SybaseASEDialect;
19+
import org.hibernate.generator.EventType;
20+
import org.hibernate.generator.EventTypeSets;
21+
import org.hibernate.generator.OnExecutionGenerator;
22+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
23+
import org.hibernate.testing.orm.junit.Jpa;
24+
import org.hibernate.testing.orm.junit.SkipForDialect;
25+
import org.junit.jupiter.api.Test;
26+
27+
import java.lang.annotation.Retention;
28+
import java.lang.annotation.RetentionPolicy;
29+
import java.util.EnumSet;
30+
import java.util.UUID;
31+
32+
import static org.junit.jupiter.api.Assertions.assertEquals;
33+
34+
@Jpa(annotatedClasses = ExportableValueGeneratorTest.WithExportableGenerator.class)
35+
@SkipForDialect( dialectClass = SybaseASEDialect.class )
36+
@SkipForDialect( dialectClass = MySQLDialect.class)
37+
public class ExportableValueGeneratorTest {
38+
39+
@Test void test(EntityManagerFactoryScope scope) {
40+
final EntityManagerFactory entityManagerFactory = scope.getEntityManagerFactory();
41+
final WithExportableGenerator first = new WithExportableGenerator();
42+
entityManagerFactory.runInTransaction( entityManager -> entityManager.persist( first ) );
43+
int firstSequenceVal = entityManagerFactory.callInTransaction( entityManager ->
44+
entityManager.find( WithExportableGenerator.class, first.uuid ).sequenceVal );
45+
assertEquals( 1, firstSequenceVal );
46+
final WithExportableGenerator second = new WithExportableGenerator();
47+
entityManagerFactory.runInTransaction( entityManager -> entityManager.persist( second ) );
48+
int secondSequenceVal = entityManagerFactory.callInTransaction( entityManager ->
49+
entityManager.find( WithExportableGenerator.class, second.uuid ).sequenceVal );
50+
assertEquals( 2, secondSequenceVal );
51+
}
52+
53+
@ValueGenerationType(generatedBy = OnExecutionSequenceGenerator.class)
54+
@Retention(RetentionPolicy.RUNTIME)
55+
@interface OnExecutionSequence {
56+
String sequenceName();
57+
}
58+
59+
public static class OnExecutionSequenceGenerator implements OnExecutionGenerator, ExportableProducer {
60+
61+
final String sequenceName;
62+
63+
public OnExecutionSequenceGenerator(OnExecutionSequence annotation) {
64+
sequenceName = annotation.sequenceName();
65+
}
66+
67+
@Override
68+
public void registerExportables(Database database) {
69+
Identifier testseq = Identifier.toIdentifier( sequenceName );
70+
database.getDefaultNamespace()
71+
.registerSequence( testseq,
72+
new Sequence( "OnExecutionSequenceGenerator", null, null, testseq ) );
73+
}
74+
75+
@Override
76+
public boolean referenceColumnsInSql(Dialect dialect) {
77+
return true;
78+
}
79+
80+
@Override
81+
public boolean writePropertyValue() {
82+
return false;
83+
}
84+
85+
@Override
86+
public String[] getReferencedColumnValues(Dialect dialect) {
87+
return new String[] { dialect.getSequenceSupport().getSelectSequenceNextValString( sequenceName ) };
88+
}
89+
90+
@Override
91+
public EnumSet<EventType> getEventTypes() {
92+
return EventTypeSets.INSERT_ONLY;
93+
}
94+
}
95+
96+
@Entity(name ="WithExportableGenerator")
97+
static class WithExportableGenerator {
98+
@Id @GeneratedValue
99+
UUID uuid;
100+
@OnExecutionSequence(sequenceName = "exported_sequence")
101+
int sequenceVal;
102+
}
103+
}

0 commit comments

Comments
 (0)