Skip to content

Commit e709838

Browse files
bjansenjrenaat
authored andcommitted
HHH-19958 Implement the custom orm.xml <generated> tag
1 parent e41bb02 commit e709838

File tree

5 files changed

+107
-1
lines changed

5 files changed

+107
-1
lines changed

hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlAnnotationHelper.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.time.OffsetTime;
2121
import java.time.ZonedDateTime;
2222
import java.util.ArrayList;
23+
import java.util.EnumSet;
2324
import java.util.List;
2425
import java.util.UUID;
2526
import java.util.function.Consumer;
@@ -32,6 +33,7 @@
3233
import org.hibernate.annotations.ResultCheckStyle;
3334
import org.hibernate.annotations.SecondaryRow;
3435
import org.hibernate.boot.internal.LimitedCollectionClassification;
36+
import org.hibernate.boot.jaxb.mapping.GenerationTiming;
3537
import org.hibernate.boot.jaxb.mapping.spi.JaxbAssociationOverrideImpl;
3638
import org.hibernate.boot.jaxb.mapping.spi.JaxbAttributeOverrideImpl;
3739
import org.hibernate.boot.jaxb.mapping.spi.JaxbBasicMapping;
@@ -90,6 +92,7 @@
9092
import org.hibernate.boot.models.xml.spi.XmlDocument;
9193
import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
9294
import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle;
95+
import org.hibernate.generator.EventType;
9396
import org.hibernate.internal.util.StringHelper;
9497
import org.hibernate.internal.util.collections.CollectionHelper;
9598
import org.hibernate.models.ModelsException;
@@ -479,6 +482,27 @@ public static void applyNationalized(
479482
memberDetails.applyAnnotationUsage( HibernateAnnotations.NATIONALIZED, xmlDocumentContext.getModelBuildingContext() );
480483
}
481484

485+
public static void applyGenerated(
486+
GenerationTiming timing,
487+
MutableMemberDetails memberDetails,
488+
XmlDocumentContext xmlDocumentContext) {
489+
if ( timing == null ) {
490+
return;
491+
}
492+
493+
EnumSet<EventType> eventTypes = timing.getEventTypes();
494+
if ( eventTypes == null ) {
495+
return;
496+
}
497+
498+
final GeneratedAnnotation generatedAnn = (GeneratedAnnotation) memberDetails.applyAnnotationUsage(
499+
HibernateAnnotations.GENERATED,
500+
xmlDocumentContext.getModelBuildingContext()
501+
);
502+
503+
generatedAnn.event( eventTypes.toArray( new EventType[0] ) );
504+
}
505+
482506
public static void applyGeneratedValue(
483507
JaxbGeneratedValueImpl jaxbGeneratedValue,
484508
MutableMemberDetails memberDetails,

hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/BasicAttributeProcessing.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ else if ( jaxbBasic.getColumn() != null ) {
7878
XmlAnnotationHelper.applyLob( jaxbBasic.getLob(), memberDetails, xmlDocumentContext );
7979
XmlAnnotationHelper.applyEnumerated( jaxbBasic.getEnumerated(), memberDetails, xmlDocumentContext );
8080
XmlAnnotationHelper.applyNationalized( jaxbBasic.getNationalized(), memberDetails, xmlDocumentContext );
81+
XmlAnnotationHelper.applyGenerated( jaxbBasic.getGenerated(), memberDetails, xmlDocumentContext );
8182

82-
// todo : value generation
8383
// todo : ...
8484

8585
return memberDetails;
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.annotations.various;
6+
7+
import org.hibernate.boot.Metadata;
8+
import org.hibernate.boot.MetadataSources;
9+
import org.hibernate.boot.registry.StandardServiceRegistry;
10+
import org.hibernate.boot.spi.MetadataImplementor;
11+
import org.hibernate.generator.EventType;
12+
import org.hibernate.mapping.GeneratorCreator;
13+
import org.hibernate.mapping.PersistentClass;
14+
import org.hibernate.testing.ServiceRegistryBuilder;
15+
import org.hibernate.testing.orm.junit.BaseUnitTest;
16+
import org.hibernate.testing.util.uuid.IdGeneratorCreationContext;
17+
import org.junit.jupiter.api.Test;
18+
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
21+
@BaseUnitTest
22+
class OrmXmlGeneratedTest {
23+
24+
@Test
25+
void testOrmXmlDefinedGenerated() {
26+
StandardServiceRegistry ssr = ServiceRegistryBuilder.buildServiceRegistry();
27+
28+
try {
29+
MetadataSources ms = new MetadataSources( ssr );
30+
ms.addResource( "org/hibernate/orm/test/annotations/generated/ormXml/orm.xml" );
31+
32+
Metadata metadata = ms.buildMetadata();
33+
34+
PersistentClass entityBinding = metadata.getEntityBinding( Tractor.class.getName() );
35+
GeneratorCreator generator = entityBinding
36+
.getProperty( "serialNumber" )
37+
.getValueGeneratorCreator();
38+
39+
assertThat( generator )
40+
.extracting( creator -> creator.createGenerator(
41+
new IdGeneratorCreationContext( (MetadataImplementor) metadata, entityBinding.getRootClass() )
42+
) )
43+
.satisfies( gen ->
44+
assertThat( gen.getEventTypes() )
45+
.containsExactly( EventType.INSERT, EventType.UPDATE, EventType.FORCE_INCREMENT )
46+
);
47+
}
48+
finally {
49+
ServiceRegistryBuilder.destroy( ssr );
50+
}
51+
}
52+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.annotations.various;
6+
7+
public class Tractor {
8+
9+
public Long id;
10+
public String model;
11+
public int serialNumber;
12+
13+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<!--
2+
~ SPDX-License-Identifier: Apache-2.0
3+
~ Copyright Red Hat Inc. and Hibernate Authors
4+
-->
5+
<entity-mappings xmlns="http://www.hibernate.org/xsd/orm/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6+
version="7.0">
7+
8+
<entity name="tractor" class="org.hibernate.orm.test.annotations.various.Tractor" access="FIELD" metadata-complete="true">
9+
<attributes>
10+
<id name="id" />
11+
<basic name="model"/>
12+
<basic name="serialNumber">
13+
<generated>ALWAYS</generated>
14+
</basic>
15+
</attributes>
16+
</entity>
17+
</entity-mappings>

0 commit comments

Comments
 (0)