Skip to content

Commit 266a4bb

Browse files
dreab8sebersole
authored andcommitted
HHH-17504 - Ongoing JPA 32 work HHH-17350 - Work on hibernate-models, XSD and JAXB HHH-16114 - Improve boot metamodel binding HHH-15996 - Develop an abstraction for Annotation in annotation processing HHH-16012 - Develop an abstraction for domain model Class refs HHH-15997 - Support for dynamic models in orm.xml HHH-15698 - Support for entity-name in mapping.xsd
1 parent 16ac752 commit 266a4bb

File tree

4 files changed

+161
-46
lines changed

4 files changed

+161
-46
lines changed

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

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,16 @@ public static MutableAnnotationUsage<JoinColumn> applyJoinColumn(
219219
return createJoinColumnAnnotation( jaxbJoinColumn, memberDetails, JoinColumn.class, xmlDocumentContext );
220220
}
221221

222+
public static MutableAnnotationUsage<JoinColumn> applyJoinColumn(
223+
JaxbJoinColumnImpl jaxbJoinColumn,
224+
XmlDocumentContext xmlDocumentContext) {
225+
if ( jaxbJoinColumn == null ) {
226+
return null;
227+
}
228+
229+
return createJoinColumnAnnotation( jaxbJoinColumn, JoinColumn.class, xmlDocumentContext );
230+
}
231+
222232
public static <A extends Annotation> MutableAnnotationUsage<A> createJoinColumnAnnotation(
223233
JaxbColumnJoined jaxbJoinColumn,
224234
MutableMemberDetails memberDetails,
@@ -245,6 +255,31 @@ public static <A extends Annotation> MutableAnnotationUsage<A> createJoinColumnA
245255
return joinColumnAnn;
246256
}
247257

258+
public static <A extends Annotation> MutableAnnotationUsage<A> createJoinColumnAnnotation(
259+
JaxbColumnJoined jaxbJoinColumn,
260+
Class<A> annotationType,
261+
XmlDocumentContext xmlDocumentContext) {
262+
final MutableAnnotationUsage<A> joinColumnAnn = XmlProcessingHelper.getOrMakeAnnotation( annotationType, xmlDocumentContext );
263+
final AnnotationDescriptor<A> joinColumnDescriptor = xmlDocumentContext
264+
.getModelBuildingContext()
265+
.getAnnotationDescriptorRegistry()
266+
.getDescriptor( annotationType );
267+
268+
ColumnProcessing.applyColumnDetails( jaxbJoinColumn, joinColumnAnn, xmlDocumentContext );
269+
270+
applyOr( jaxbJoinColumn, JaxbColumnJoined::getReferencedColumnName, "referencedColumnName", joinColumnAnn, joinColumnDescriptor );
271+
272+
final JaxbForeignKeyImpl jaxbForeignKey = jaxbJoinColumn.getForeignKey();
273+
if ( jaxbForeignKey != null ) {
274+
joinColumnAnn.setAttributeValue(
275+
"foreignKey",
276+
createForeignKeyAnnotation( jaxbForeignKey, xmlDocumentContext )
277+
);
278+
}
279+
280+
return joinColumnAnn;
281+
}
282+
248283
public static void applyJoinColumns(
249284
List<JaxbJoinColumnImpl> jaxbJoinColumns,
250285
MutableMemberDetails memberDetails,
@@ -280,6 +315,19 @@ public static List<AnnotationUsage<JoinColumn>> createJoinColumns(
280315
return joinColumns;
281316
}
282317

318+
public static List<AnnotationUsage<JoinColumn>> createJoinColumns(
319+
List<JaxbJoinColumnImpl> jaxbJoinColumns,
320+
XmlDocumentContext xmlDocumentContext) {
321+
if ( CollectionHelper.isEmpty( jaxbJoinColumns ) ) {
322+
return Collections.emptyList();
323+
}
324+
final List<AnnotationUsage<JoinColumn>> joinColumns = new ArrayList<>( jaxbJoinColumns.size() );
325+
jaxbJoinColumns.forEach( jaxbJoinColumn -> {
326+
joinColumns.add( applyJoinColumn( jaxbJoinColumn, xmlDocumentContext ) );
327+
} );
328+
return joinColumns;
329+
}
330+
283331
public static <T,N> void applyOr(
284332
N jaxbNode,
285333
Function<N,T> jaxbValueAccess,
@@ -429,6 +477,23 @@ public static MutableAnnotationUsage<ForeignKey> createForeignKeyAnnotation(
429477
return foreignKeyAnn;
430478
}
431479

480+
public static MutableAnnotationUsage<ForeignKey> createForeignKeyAnnotation(
481+
JaxbForeignKeyImpl jaxbForeignKey,
482+
XmlDocumentContext xmlDocumentContext) {
483+
final MutableAnnotationUsage<ForeignKey> foreignKeyAnn = XmlProcessingHelper.getOrMakeAnnotation( ForeignKey.class, xmlDocumentContext );
484+
final AnnotationDescriptor<ForeignKey> foreignKeyDescriptor = xmlDocumentContext
485+
.getModelBuildingContext()
486+
.getAnnotationDescriptorRegistry()
487+
.getDescriptor( ForeignKey.class );
488+
489+
applyOr( jaxbForeignKey, JaxbForeignKeyImpl::getName, "name", foreignKeyAnn, foreignKeyDescriptor );
490+
applyOr( jaxbForeignKey, JaxbForeignKeyImpl::getConstraintMode, "value", foreignKeyAnn, foreignKeyDescriptor );
491+
applyOr( jaxbForeignKey, JaxbForeignKeyImpl::getForeignKeyDefinition, "foreignKeyDefinition", foreignKeyAnn, foreignKeyDescriptor );
492+
applyOr( jaxbForeignKey, JaxbForeignKeyImpl::getOptions, "options", foreignKeyAnn, foreignKeyDescriptor );
493+
494+
return foreignKeyAnn;
495+
}
496+
432497
public static void applyMapKeyColumn(
433498
JaxbMapKeyColumnImpl jaxbMapKeyColumn,
434499
MutableMemberDetails memberDetails,
@@ -622,6 +687,26 @@ public static <A extends Annotation> void applyCheckConstraints(
622687
}
623688
}
624689

690+
public static <A extends Annotation> void applyCheckConstraints(
691+
JaxbCheckable jaxbCheckable,
692+
MutableAnnotationUsage<A> annotationUsage,
693+
XmlDocumentContext xmlDocumentContext) {
694+
if ( CollectionHelper.isNotEmpty( jaxbCheckable.getCheckConstraints() ) ) {
695+
final List<AnnotationUsage<CheckConstraint>> checks = new ArrayList<>( jaxbCheckable.getCheckConstraints().size() );
696+
final AnnotationDescriptor<CheckConstraint> checkConstraintDescriptor = xmlDocumentContext.getModelBuildingContext()
697+
.getAnnotationDescriptorRegistry()
698+
.getDescriptor( CheckConstraint.class );
699+
for ( JaxbCheckConstraintImpl jaxbCheck : jaxbCheckable.getCheckConstraints() ) {
700+
final MutableAnnotationUsage<CheckConstraint> checkAnn = XmlProcessingHelper.getOrMakeAnnotation( CheckConstraint.class, xmlDocumentContext );
701+
applyOr( jaxbCheck, JaxbCheckConstraintImpl::getName, "name", checkAnn, checkConstraintDescriptor );
702+
applyOr( jaxbCheck, JaxbCheckConstraintImpl::getConstraint, "constraint", checkAnn, checkConstraintDescriptor );
703+
applyOr( jaxbCheck, JaxbCheckConstraintImpl::getOptions, "options", checkAnn, checkConstraintDescriptor );
704+
checks.add( checkAnn );
705+
}
706+
annotationUsage.setAttributeValue( "check", checks );
707+
}
708+
}
709+
625710
public static void applyTargetClass(
626711
String name,
627712
MutableMemberDetails memberDetails,

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ public static <A extends Annotation> MutableAnnotationUsage<A> getOrMakeAnnotati
125125
return makeAnnotation( annotationType, target, xmlDocumentContext );
126126
}
127127

128+
public static <A extends Annotation> MutableAnnotationUsage<A> getOrMakeAnnotation(
129+
Class<A> annotationType,
130+
XmlDocumentContext xmlDocumentContext) {
131+
132+
return makeAnnotation( annotationType, xmlDocumentContext );
133+
}
134+
128135
/**
129136
* Make a nested AnnotationUsage. The usage is created with the given target,
130137
* but it is not added to the target's annotations.
@@ -141,6 +148,16 @@ public static <A extends Annotation> MutableAnnotationUsage<A> makeNestedAnnotat
141148
);
142149
}
143150

151+
public static <A extends Annotation> MutableAnnotationUsage<A> makeNestedAnnotation(
152+
Class<A> annotationType,
153+
XmlDocumentContext xmlDocumentContext) {
154+
return new DynamicAnnotationUsage<>(
155+
xmlDocumentContext.getModelBuildingContext()
156+
.getAnnotationDescriptorRegistry()
157+
.getDescriptor( annotationType )
158+
);
159+
}
160+
144161
/**
145162
* Make an AnnotationUsage.
146163
* Used when applying XML in complete mode or when {@linkplain #getOrMakeAnnotation}
@@ -155,6 +172,13 @@ public static <A extends Annotation> MutableAnnotationUsage<A> makeAnnotation(
155172
return created;
156173
}
157174

175+
public static <A extends Annotation> MutableAnnotationUsage<A> makeAnnotation(
176+
Class<A> annotationType,
177+
XmlDocumentContext xmlDocumentContext) {
178+
final MutableAnnotationUsage<A> created = makeNestedAnnotation( annotationType, xmlDocumentContext );
179+
return created;
180+
}
181+
158182
/**
159183
* Find an existing annotation by name, or create one.
160184
* Used when applying XML in override mode.

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

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,13 @@ public static MutableMemberDetails processElementCollectionAttribute(
4848
xmlDocumentContext
4949
);
5050
XmlProcessingHelper.setIf( jaxbElementCollection.getFetch(), "fetch", elementCollectionAnn );
51-
if ( StringHelper.isNotEmpty( jaxbElementCollection.getTargetClass() ) ) {
52-
elementCollectionAnn.setAttributeValue(
53-
"targetClass",
54-
XmlAnnotationHelper.resolveJavaType(
55-
jaxbElementCollection.getTargetClass(),
56-
xmlDocumentContext.getModelBuildingContext()
57-
)
58-
);
59-
}
51+
elementCollectionAnn.setAttributeValue(
52+
"targetClass",
53+
XmlAnnotationHelper.resolveJavaType(
54+
jaxbElementCollection.getTargetClass(),
55+
xmlDocumentContext.getModelBuildingContext()
56+
)
57+
);
6058

6159
CommonAttributeProcessing.applyAttributeBasics( jaxbElementCollection, memberDetails, elementCollectionAnn, accessType, xmlDocumentContext );
6260

@@ -73,11 +71,6 @@ public static MutableMemberDetails processElementCollectionAttribute(
7371
XmlAnnotationHelper.applyTemporal( jaxbElementCollection.getTemporal(), memberDetails, xmlDocumentContext );
7472
XmlAnnotationHelper.applyBasicTypeComposition( jaxbElementCollection, memberDetails, xmlDocumentContext );
7573

76-
if ( StringHelper.isNotEmpty( jaxbElementCollection.getTargetClass() ) ) {
77-
final MutableAnnotationUsage<Target> targetAnn = XmlProcessingHelper.getOrMakeAnnotation( Target.class, memberDetails, xmlDocumentContext );
78-
targetAnn.setAttributeValue( "value", jaxbElementCollection.getTargetClass() );
79-
}
80-
8174
jaxbElementCollection.getConverts().forEach( (jaxbConvert) -> {
8275
XmlAnnotationHelper.applyConvert( jaxbConvert, memberDetails, xmlDocumentContext );
8376
} );
@@ -110,12 +103,12 @@ public static void applyCollectionTable(
110103
XmlAnnotationHelper.applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getSchema, "schema", collectionTableAnn, collectionTableDescriptor );
111104
XmlAnnotationHelper.applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getOptions, "options", collectionTableAnn, collectionTableDescriptor );
112105

113-
collectionTableAnn.setAttributeValue( "joinColumns", XmlAnnotationHelper.createJoinColumns( jaxbCollectionTable.getJoinColumns(), memberDetails, xmlDocumentContext ) );
106+
collectionTableAnn.setAttributeValue( "joinColumns", XmlAnnotationHelper.createJoinColumns( jaxbCollectionTable.getJoinColumns(), xmlDocumentContext ) );
114107

115108
if ( jaxbCollectionTable.getForeignKeys() != null ) {
116109
collectionTableAnn.setAttributeValue(
117110
"foreignKey",
118-
XmlAnnotationHelper.createForeignKeyAnnotation( jaxbCollectionTable.getForeignKeys(), memberDetails, xmlDocumentContext )
111+
XmlAnnotationHelper.createForeignKeyAnnotation( jaxbCollectionTable.getForeignKeys(), xmlDocumentContext )
119112
);
120113
}
121114

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

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -38,37 +38,57 @@ public static <A extends Annotation> void applyColumnDetails(
3838
return;
3939
}
4040

41-
applyColumnBasics( jaxbColumn, target, columnAnn, xmlDocumentContext );
42-
applyColumnNullness( jaxbColumn, target, columnAnn, xmlDocumentContext );
43-
applyColumnMutability( jaxbColumn, target, columnAnn, xmlDocumentContext );
44-
applyColumnDefinition( jaxbColumn, target, columnAnn, xmlDocumentContext );
45-
applyColumnUniqueness( jaxbColumn, target, columnAnn, xmlDocumentContext );
46-
applyColumnComment( jaxbColumn, target, columnAnn, xmlDocumentContext );
41+
applyColumnBasics( jaxbColumn, columnAnn, xmlDocumentContext );
42+
applyColumnNullness( jaxbColumn, columnAnn, xmlDocumentContext );
43+
applyColumnMutability( jaxbColumn, columnAnn, xmlDocumentContext );
44+
applyColumnDefinition( jaxbColumn, columnAnn, xmlDocumentContext );
45+
applyColumnUniqueness( jaxbColumn, columnAnn, xmlDocumentContext );
46+
applyColumnComment( jaxbColumn, columnAnn, xmlDocumentContext );
4747
XmlAnnotationHelper.applyCheckConstraints( jaxbColumn, target, columnAnn, xmlDocumentContext );
4848

4949
if ( jaxbColumn instanceof JaxbColumnSizable sizable ) {
50-
applyColumnSizing( sizable, target, columnAnn, xmlDocumentContext );
50+
applyColumnSizing( sizable, columnAnn, xmlDocumentContext );
5151
}
5252

5353
}
5454

55+
public static <A extends Annotation> void applyColumnDetails(
56+
JaxbColumnCommon jaxbColumn,
57+
MutableAnnotationUsage<A> columnAnn,
58+
XmlDocumentContext xmlDocumentContext) {
59+
if ( jaxbColumn == null ) {
60+
return;
61+
}
62+
63+
applyColumnBasics( jaxbColumn, columnAnn, xmlDocumentContext );
64+
applyColumnNullness( jaxbColumn, columnAnn, xmlDocumentContext );
65+
applyColumnMutability( jaxbColumn, columnAnn, xmlDocumentContext );
66+
applyColumnDefinition( jaxbColumn, columnAnn, xmlDocumentContext );
67+
applyColumnUniqueness( jaxbColumn, columnAnn, xmlDocumentContext );
68+
applyColumnComment( jaxbColumn, columnAnn, xmlDocumentContext );
69+
XmlAnnotationHelper.applyCheckConstraints( jaxbColumn, columnAnn, xmlDocumentContext );
70+
71+
if ( jaxbColumn instanceof JaxbColumnSizable sizable ) {
72+
applyColumnSizing( sizable, columnAnn, xmlDocumentContext );
73+
}
74+
}
75+
5576
public static <A extends Annotation> void applyColumnDetails(
5677
JaxbColumnStandard jaxbColumn,
57-
MutableAnnotationTarget target,
5878
MutableAnnotationUsage<A> columnAnn,
5979
XmlDocumentContext xmlDocumentContext) {
6080
if ( jaxbColumn == null ) {
6181
return;
6282
}
6383

64-
applyColumnBasics( jaxbColumn, target, columnAnn, xmlDocumentContext );
65-
applyColumnNullness( jaxbColumn, target, columnAnn, xmlDocumentContext );
66-
applyColumnMutability( jaxbColumn, target, columnAnn, xmlDocumentContext );
67-
applyColumnDefinition( jaxbColumn, target, columnAnn, xmlDocumentContext );
68-
applyColumnSizing( jaxbColumn, target, columnAnn, xmlDocumentContext );
69-
applyColumnUniqueness( jaxbColumn, target, columnAnn, xmlDocumentContext );
70-
applyColumnComment( jaxbColumn, target, columnAnn, xmlDocumentContext );
71-
XmlAnnotationHelper.applyCheckConstraints( jaxbColumn, target, columnAnn, xmlDocumentContext );
84+
applyColumnBasics( jaxbColumn, columnAnn, xmlDocumentContext );
85+
applyColumnNullness( jaxbColumn, columnAnn, xmlDocumentContext );
86+
applyColumnMutability( jaxbColumn, columnAnn, xmlDocumentContext );
87+
applyColumnDefinition( jaxbColumn, columnAnn, xmlDocumentContext );
88+
applyColumnSizing( jaxbColumn, columnAnn, xmlDocumentContext );
89+
applyColumnUniqueness( jaxbColumn, columnAnn, xmlDocumentContext );
90+
applyColumnComment( jaxbColumn, columnAnn, xmlDocumentContext );
91+
XmlAnnotationHelper.applyCheckConstraints( jaxbColumn, columnAnn, xmlDocumentContext );
7292
}
7393

7494
public static <A extends Annotation> void applyColumnDetails(
@@ -80,30 +100,30 @@ public static <A extends Annotation> void applyColumnDetails(
80100
return;
81101
}
82102

83-
applyColumnBasics( jaxbColumn, target, columnAnn, xmlDocumentContext );
103+
applyColumnBasics( jaxbColumn, columnAnn, xmlDocumentContext );
84104

85105
if ( jaxbColumn instanceof JaxbColumnNullable nullable ) {
86-
applyColumnNullness( nullable, target, columnAnn, xmlDocumentContext );
106+
applyColumnNullness( nullable, columnAnn, xmlDocumentContext );
87107
}
88108

89109
if ( jaxbColumn instanceof JaxbColumnMutable mutable ) {
90-
applyColumnMutability( mutable, target, columnAnn, xmlDocumentContext );
110+
applyColumnMutability( mutable, columnAnn, xmlDocumentContext );
91111
}
92112

93113
if ( jaxbColumn instanceof JaxbColumnDefinable definable ) {
94-
applyColumnDefinition( definable, target, columnAnn, xmlDocumentContext );
114+
applyColumnDefinition( definable, columnAnn, xmlDocumentContext );
95115
}
96116

97117
if ( jaxbColumn instanceof JaxbColumnSizable sizable ) {
98-
applyColumnSizing( sizable, target, columnAnn, xmlDocumentContext );
118+
applyColumnSizing( sizable, columnAnn, xmlDocumentContext );
99119
}
100120

101121
if ( jaxbColumn instanceof JaxbColumnUniqueable uniqueable ) {
102-
applyColumnUniqueness( uniqueable, target, columnAnn, xmlDocumentContext );
122+
applyColumnUniqueness( uniqueable, columnAnn, xmlDocumentContext );
103123
}
104124

105125
if ( jaxbColumn instanceof JaxbCommentable commentable ) {
106-
applyColumnComment( commentable, target, columnAnn, xmlDocumentContext );
126+
applyColumnComment( commentable, columnAnn, xmlDocumentContext );
107127
}
108128

109129
if ( jaxbColumn instanceof JaxbCheckable checkable ) {
@@ -113,7 +133,6 @@ public static <A extends Annotation> void applyColumnDetails(
113133

114134
private static <A extends Annotation> void applyColumnBasics(
115135
JaxbColumn jaxbColumn,
116-
MutableAnnotationTarget target,
117136
MutableAnnotationUsage<A> columnAnn,
118137
XmlDocumentContext xmlDocumentContext) {
119138
if ( StringHelper.isNotEmpty( jaxbColumn.getName() ) ) {
@@ -127,7 +146,6 @@ private static <A extends Annotation> void applyColumnBasics(
127146

128147
private static <A extends Annotation> void applyColumnNullness(
129148
JaxbColumnNullable jaxbColumn,
130-
MutableAnnotationTarget target,
131149
MutableAnnotationUsage<A> columnAnn,
132150
XmlDocumentContext xmlDocumentContext) {
133151
if ( jaxbColumn.isNullable() != null ) {
@@ -137,7 +155,6 @@ private static <A extends Annotation> void applyColumnNullness(
137155

138156
private static <A extends Annotation> void applyColumnMutability(
139157
JaxbColumnMutable jaxbColumn,
140-
MutableAnnotationTarget target,
141158
MutableAnnotationUsage<A> columnAnn,
142159
XmlDocumentContext xmlDocumentContext) {
143160
if ( jaxbColumn.isInsertable() != null ) {
@@ -151,7 +168,6 @@ private static <A extends Annotation> void applyColumnMutability(
151168

152169
private static <A extends Annotation> void applyColumnSizing(
153170
JaxbColumnSizable jaxbColumn,
154-
MutableAnnotationTarget target,
155171
MutableAnnotationUsage<A> columnAnn,
156172
XmlDocumentContext xmlDocumentContext) {
157173

@@ -170,7 +186,6 @@ private static <A extends Annotation> void applyColumnSizing(
170186

171187
private static <A extends Annotation> void applyColumnUniqueness(
172188
JaxbColumnUniqueable jaxbColumn,
173-
MutableAnnotationTarget target,
174189
MutableAnnotationUsage<A> columnAnn,
175190
XmlDocumentContext xmlDocumentContext) {
176191
if ( jaxbColumn.isUnique() != null ) {
@@ -180,7 +195,6 @@ private static <A extends Annotation> void applyColumnUniqueness(
180195

181196
private static <A extends Annotation> void applyColumnDefinition(
182197
JaxbColumnDefinable jaxbColumn,
183-
MutableAnnotationTarget target,
184198
MutableAnnotationUsage<A> columnAnn,
185199
XmlDocumentContext xmlDocumentContext) {
186200
if ( StringHelper.isNotEmpty( jaxbColumn.getColumnDefinition() ) ) {
@@ -194,7 +208,6 @@ private static <A extends Annotation> void applyColumnDefinition(
194208

195209
private static <A extends Annotation> void applyColumnComment(
196210
JaxbCommentable jaxbColumn,
197-
MutableAnnotationTarget target,
198211
MutableAnnotationUsage<A> columnAnn,
199212
XmlDocumentContext xmlDocumentContext) {
200213
if ( StringHelper.isNotEmpty( jaxbColumn.getComment() ) ) {

0 commit comments

Comments
 (0)