Skip to content

Commit a1e7aae

Browse files
committed
HHH-18983 add test for value generator implementing ExportableProducer
1 parent 7fbcd51 commit a1e7aae

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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.generator.EventType;
18+
import org.hibernate.generator.EventTypeSets;
19+
import org.hibernate.generator.OnExecutionGenerator;
20+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
21+
import org.hibernate.testing.orm.junit.Jpa;
22+
import org.junit.jupiter.api.Test;
23+
24+
import java.lang.annotation.Retention;
25+
import java.lang.annotation.RetentionPolicy;
26+
import java.util.EnumSet;
27+
import java.util.UUID;
28+
29+
import static org.junit.jupiter.api.Assertions.assertEquals;
30+
31+
@Jpa(annotatedClasses = ExportableValueGeneratorTest.WithExportableGenerator.class)
32+
public class ExportableValueGeneratorTest {
33+
34+
@Test void test(EntityManagerFactoryScope scope) {
35+
final EntityManagerFactory entityManagerFactory = scope.getEntityManagerFactory();
36+
final WithExportableGenerator first = new WithExportableGenerator();
37+
entityManagerFactory.runInTransaction( entityManager -> entityManager.persist( first ) );
38+
int firstSequenceVal = entityManagerFactory.callInTransaction( entityManager ->
39+
entityManager.find( WithExportableGenerator.class, first.uuid ).sequenceVal );
40+
assertEquals( 1, firstSequenceVal );
41+
final WithExportableGenerator second = new WithExportableGenerator();
42+
entityManagerFactory.runInTransaction( entityManager -> entityManager.persist( second ) );
43+
int secondSequenceVal = entityManagerFactory.callInTransaction( entityManager ->
44+
entityManager.find( WithExportableGenerator.class, second.uuid ).sequenceVal );
45+
assertEquals( 2, secondSequenceVal );
46+
}
47+
48+
@ValueGenerationType(generatedBy = OnExecutionSequenceGenerator.class)
49+
@Retention(RetentionPolicy.RUNTIME)
50+
@interface OnExecutionSequence {
51+
String sequenceName();
52+
}
53+
54+
public static class OnExecutionSequenceGenerator implements OnExecutionGenerator, ExportableProducer {
55+
56+
String sequenceName;
57+
58+
public OnExecutionSequenceGenerator(OnExecutionSequence annotation) {
59+
sequenceName = annotation.sequenceName();
60+
}
61+
62+
@Override
63+
public void registerExportables(Database database) {
64+
Identifier testseq = Identifier.toIdentifier( sequenceName );
65+
database.getDefaultNamespace()
66+
.registerSequence( testseq,
67+
new Sequence( "OnExecutionSequenceGenerator", null, null, testseq ) );
68+
}
69+
70+
@Override
71+
public boolean referenceColumnsInSql(Dialect dialect) {
72+
return true;
73+
}
74+
75+
@Override
76+
public boolean writePropertyValue() {
77+
return false;
78+
}
79+
80+
@Override
81+
public String[] getReferencedColumnValues(Dialect dialect) {
82+
return new String[] { dialect.getSequenceSupport().getSelectSequenceNextValString( sequenceName ) };
83+
}
84+
85+
@Override
86+
public EnumSet<EventType> getEventTypes() {
87+
return EventTypeSets.INSERT_ONLY;
88+
}
89+
}
90+
91+
@Entity(name ="WithExportableGenerator")
92+
static class WithExportableGenerator {
93+
@Id @GeneratedValue
94+
UUID uuid;
95+
@OnExecutionSequence(sequenceName = "exported_sequence")
96+
int sequenceVal;
97+
}
98+
}

0 commit comments

Comments
 (0)