Skip to content

Commit a54f750

Browse files
committed
HHH-7837 Support Hibernate's @cascade annotation in metamodel
1 parent 727e51c commit a54f750

File tree

8 files changed

+99
-23
lines changed

8 files changed

+99
-23
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/ManyToAnyPluralAttributeElementSourceImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ public ManyToAnyPluralAttributeElementSourceImpl(PluralAssociationAttribute attr
1717

1818
@Override
1919
public Iterable<CascadeStyle> getCascadeStyles() {
20-
return EnumConversionHelper.cascadeTypeToCascadeStyleSet( attribute.getCascadeTypes(), attribute.getContext() );
20+
21+
return EnumConversionHelper.cascadeTypeToCascadeStyleSet(
22+
attribute.getCascadeTypes(),
23+
attribute.getHibernateCascadeTypes(),
24+
attribute.getContext() );
2125
}
2226

2327
@Override

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/ManyToManyPluralAttributeElementSourceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.hibernate.metamodel.internal.source.annotations.util.EnumConversionHelper;
3535
import org.hibernate.metamodel.internal.source.annotations.util.JPADotNames;
3636
import org.hibernate.metamodel.internal.source.annotations.util.JandexHelper;
37-
import org.hibernate.metamodel.spi.binding.CascadeType;
3837
import org.hibernate.metamodel.spi.relational.Value;
3938
import org.hibernate.metamodel.spi.source.ForeignKeyContributingSource;
4039
import org.hibernate.metamodel.spi.source.ManyToManyPluralAttributeElementSource;
@@ -71,6 +70,7 @@ public ManyToManyPluralAttributeElementSourceImpl(
7170

7271
cascadeStyles = EnumConversionHelper.cascadeTypeToCascadeStyleSet(
7372
associationAttribute.getCascadeTypes(),
73+
associationAttribute.getHibernateCascadeTypes(),
7474
associationAttribute.getContext() );
7575
}
7676

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/OneToManyPluralAttributeElementSourceImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
*/
2424
package org.hibernate.metamodel.internal.source.annotations;
2525

26-
import java.util.Collections;
27-
2826
import org.hibernate.AssertionFailure;
2927
import org.hibernate.engine.spi.CascadeStyle;
3028
import org.hibernate.metamodel.internal.source.annotations.attribute.PluralAssociationAttribute;
@@ -53,7 +51,10 @@ public boolean isNotFoundAnException() {
5351

5452
@Override
5553
public Iterable<CascadeStyle> getCascadeStyles() {
56-
return EnumConversionHelper.cascadeTypeToCascadeStyleSet( associationAttribute.getCascadeTypes(), associationAttribute.getContext() );
54+
return EnumConversionHelper.cascadeTypeToCascadeStyleSet(
55+
associationAttribute.getCascadeTypes(),
56+
associationAttribute.getHibernateCascadeTypes(),
57+
associationAttribute.getContext() );
5758
}
5859

5960
@Override

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/ToOneAttributeSourceImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public ToOneAttributeSourceImpl(AssociationAttribute associationAttribute) {
5959
this.associationAttribute = associationAttribute;
6060
this.cascadeStyles = EnumConversionHelper.cascadeTypeToCascadeStyleSet(
6161
associationAttribute.getCascadeTypes(),
62+
associationAttribute.getHibernateCascadeTypes(),
6263
associationAttribute.getContext()
6364
);
6465
}

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/attribute/AssociationAttribute.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
* Represents an association attribute.
5959
*
6060
* @author Hardy Ferentschik
61+
* @author Brett Meyer
6162
*/
6263
public class AssociationAttribute extends MappedAttribute {
6364
private static final CoreMessageLogger coreLogger = Logger.getMessageLogger(
@@ -69,6 +70,7 @@ public class AssociationAttribute extends MappedAttribute {
6970
private final String referencedEntityType;
7071
private final String mappedBy;
7172
private final Set<CascadeType> cascadeTypes;
73+
private final Set<org.hibernate.annotations.CascadeType> hibernateCascadeTypes;
7274
private final boolean isOptional;
7375
private final boolean isLazy;
7476
private final boolean isUnWrapProxy;
@@ -122,6 +124,7 @@ public static AssociationAttribute createAssociationAttribute(
122124
this.isUnWrapProxy = determinIsUnwrapProxy();
123125
this.isOrphanRemoval = determineOrphanRemoval( associationAnnotation );
124126
this.cascadeTypes = determineCascadeTypes( associationAnnotation );
127+
this.hibernateCascadeTypes = determineHibernateCascadeTypes( annotations );
125128
this.joinColumnValues = determineJoinColumnAnnotations( annotations );
126129

127130
this.fetchStyle = determineFetchStyle();
@@ -147,6 +150,10 @@ public Set<CascadeType> getCascadeTypes() {
147150
return cascadeTypes;
148151
}
149152

153+
public Set<org.hibernate.annotations.CascadeType> getHibernateCascadeTypes() {
154+
return hibernateCascadeTypes;
155+
}
156+
150157
public boolean isOrphanRemoval() {
151158
return isOrphanRemoval;
152159
}
@@ -354,6 +361,26 @@ private Set<CascadeType> determineCascadeTypes(AnnotationInstance associationAnn
354361
return cascadeTypes;
355362
}
356363

364+
private Set<org.hibernate.annotations.CascadeType> determineHibernateCascadeTypes(
365+
Map<DotName, List<AnnotationInstance>> annotations) {
366+
AnnotationInstance cascadeAnnotation = JandexHelper
367+
.getSingleAnnotation(
368+
annotations, HibernateDotNames.CASCADE );
369+
Set<org.hibernate.annotations.CascadeType> cascadeTypes
370+
= new HashSet<org.hibernate.annotations.CascadeType>();
371+
if ( cascadeAnnotation != null ) {
372+
AnnotationValue cascadeValue = cascadeAnnotation.value();
373+
if ( cascadeValue != null ) {
374+
String[] cascades = cascadeValue.asEnumArray();
375+
for ( String s : cascades ) {
376+
cascadeTypes.add( Enum.valueOf(
377+
org.hibernate.annotations.CascadeType.class, s ) );
378+
}
379+
}
380+
}
381+
return cascadeTypes;
382+
}
383+
357384
private FetchStyle determineFetchStyle() {
358385
AnnotationInstance fetchAnnotation = JandexHelper.getSingleAnnotation( annotations(), HibernateDotNames.FETCH );
359386
if ( fetchAnnotation != null ) {

hibernate-core/src/main/java/org/hibernate/metamodel/internal/source/annotations/util/EnumConversionHelper.java

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
* Helper class which converts between different enum types.
4343
*
4444
* @author Hardy Ferentschik
45+
* @author Brett Meyer
4546
*/
4647
public class EnumConversionHelper {
4748
private EnumConversionHelper() {
@@ -92,6 +93,45 @@ public static CascadeStyle cascadeTypeToCascadeStyle(CascadeType cascadeType) {
9293
}
9394
}
9495
}
96+
97+
public static CascadeStyle cascadeTypeToCascadeStyle(
98+
org.hibernate.annotations.CascadeType cascadeType) {
99+
switch ( cascadeType ) {
100+
case ALL: {
101+
return CascadeStyles.ALL;
102+
}
103+
case PERSIST: {
104+
return CascadeStyles.PERSIST;
105+
}
106+
case MERGE: {
107+
return CascadeStyles.MERGE;
108+
}
109+
case REMOVE: {
110+
return CascadeStyles.DELETE;
111+
}
112+
case REFRESH: {
113+
return CascadeStyles.REFRESH;
114+
}
115+
case DETACH: {
116+
return CascadeStyles.EVICT;
117+
}
118+
case DELETE: {
119+
return CascadeStyles.DELETE;
120+
}
121+
case SAVE_UPDATE: {
122+
return CascadeStyles.UPDATE;
123+
}
124+
case REPLICATE: {
125+
return CascadeStyles.REPLICATE;
126+
}
127+
case LOCK: {
128+
return CascadeStyles.LOCK;
129+
}
130+
default: {
131+
throw new AssertionFailure( "Unknown cascade type" );
132+
}
133+
}
134+
}
95135

96136
public static FetchMode annotationFetchModeToHibernateFetchMode(org.hibernate.annotations.FetchMode annotationFetchMode) {
97137
switch ( annotationFetchMode ) {
@@ -129,18 +169,25 @@ public static FetchStyle annotationFetchModeToFetchStyle(org.hibernate.annotatio
129169
}
130170
}
131171

132-
public static Set<CascadeStyle> cascadeTypeToCascadeStyleSet(Set<CascadeType> cascadeTypes, EntityBindingContext context) {
133-
if ( CollectionHelper.isEmpty( cascadeTypes ) ) {
134-
final Set<CascadeStyle> cascadeStyles = new HashSet<CascadeStyle>();
172+
public static Set<CascadeStyle> cascadeTypeToCascadeStyleSet(
173+
Set<CascadeType> cascadeTypes,
174+
Set<org.hibernate.annotations.CascadeType> hibernateCascadeTypes,
175+
EntityBindingContext context) {
176+
Set<CascadeStyle> cascadeStyleSet = new HashSet<CascadeStyle>();
177+
if ( CollectionHelper.isEmpty( cascadeTypes )
178+
&& CollectionHelper.isEmpty( hibernateCascadeTypes ) ) {
135179
String cascades = context.getMappingDefaults().getCascadeStyle();
136180
for ( String cascade : StringHelper.split( ",", cascades ) ) {
137-
cascadeStyles.add( CascadeStyles.getCascadeStyle( cascade ) );
181+
cascadeStyleSet.add( CascadeStyles.getCascadeStyle( cascade ) );
138182
}
139-
return cascadeStyles;
140183
}
141-
Set<CascadeStyle> cascadeStyleSet = new HashSet<CascadeStyle>();
142-
for ( CascadeType cascadeType : cascadeTypes ) {
143-
cascadeStyleSet.add( cascadeTypeToCascadeStyle( cascadeType ) );
184+
else {
185+
for ( CascadeType cascadeType : cascadeTypes ) {
186+
cascadeStyleSet.add( cascadeTypeToCascadeStyle( cascadeType ) );
187+
}
188+
for ( org.hibernate.annotations.CascadeType cascadeType : hibernateCascadeTypes ) {
189+
cascadeStyleSet.add( cascadeTypeToCascadeStyle( cascadeType ) );
190+
}
144191
}
145192
return cascadeStyleSet;
146193
}

hibernate-core/src/test/java/org/hibernate/test/annotations/cascade/multicircle/nonjpa/identity/MultiCircleNonJpaCascadeIdentityTest.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@
2424
package org.hibernate.test.annotations.cascade.multicircle.nonjpa.identity;
2525

2626
import junit.framework.Assert;
27-
import org.junit.After;
28-
import org.junit.Before;
29-
import org.junit.Test;
3027

3128
import org.hibernate.Session;
3229
import org.hibernate.testing.DialectChecks;
33-
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
3430
import org.hibernate.testing.RequiresDialectFeature;
3531
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
32+
import org.junit.After;
33+
import org.junit.Before;
34+
import org.junit.Test;
3635

3736
/**
3837
* This test uses a complicated model that requires Hibernate to delay
@@ -83,7 +82,6 @@
8382
* c, e, d, b, g, f.
8483
*/
8584
@RequiresDialectFeature(DialectChecks.SupportsIdentityColumns.class)
86-
@FailureExpectedWithNewMetamodel
8785
public class MultiCircleNonJpaCascadeIdentityTest extends BaseCoreFunctionalTestCase {
8886
private B b;
8987
private C c;

hibernate-core/src/test/java/org/hibernate/test/annotations/cascade/multicircle/nonjpa/sequence/MultiCircleNonJpaCascadeSequenceTest.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@
2424
package org.hibernate.test.annotations.cascade.multicircle.nonjpa.sequence;
2525

2626
import junit.framework.Assert;
27-
import org.junit.After;
28-
import org.junit.Before;
29-
import org.junit.Test;
3027

3128
import org.hibernate.Session;
32-
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
3329
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
30+
import org.junit.After;
31+
import org.junit.Before;
32+
import org.junit.Test;
3433

3534
/**
3635
* This test uses a complicated model that requires Hibernate to delay
@@ -80,7 +79,6 @@
8079
* Entities are inserted in the following order:
8180
* c, e, d, b, g, f.
8281
*/
83-
@FailureExpectedWithNewMetamodel
8482
public class MultiCircleNonJpaCascadeSequenceTest extends BaseCoreFunctionalTestCase {
8583
private B b;
8684
private C c;

0 commit comments

Comments
 (0)