Skip to content

Commit d18a34b

Browse files
committed
HHH-19959 map default-cascade attribute in hbm.xml files
1 parent 6eba60e commit d18a34b

File tree

5 files changed

+108
-9
lines changed

5 files changed

+108
-9
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/OverriddenMappingDefaults.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public static class Builder {
151151
private String implicitDiscriminatorColumnName;
152152
private String implicitPackageName;
153153
private boolean autoImportEnabled;
154-
private final EnumSet<CascadeType> implicitCascadeTypes;
154+
private EnumSet<CascadeType> implicitCascadeTypes;
155155
private jakarta.persistence.AccessType implicitPropertyAccessType;
156156
private String implicitPropertyAccessorName;
157157
private boolean entitiesImplicitlyLazy;
@@ -229,12 +229,12 @@ public Builder setAutoImportEnabled(boolean autoImportEnabled) {
229229
return this;
230230
}
231231

232-
// public Builder setImplicitCascadeStyleName(String implicitCascadeStyleName) {
233-
// if ( StringHelper.isNotEmpty( implicitCascadeStyleName ) ) {
234-
// this.implicitCascadeStyleName = implicitCascadeStyleName;
235-
// }
236-
// return this;
237-
// }
232+
public Builder setImplicitCascadeTypes(EnumSet<CascadeType> implicitCascadeTypes) {
233+
if (implicitCascadeTypes != null) {
234+
this.implicitCascadeTypes = implicitCascadeTypes;
235+
}
236+
return this;
237+
}
238238

239239
public Builder setImplicitPropertyAccessType(jakarta.persistence.AccessType accessType) {
240240
if ( accessType != null ) {

hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/MappingDocument.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
*/
55
package org.hibernate.boot.model.source.internal.hbm;
66

7+
import java.util.EnumSet;
78
import java.util.Set;
89

10+
import org.hibernate.annotations.CascadeType;
911
import org.hibernate.boot.jaxb.Origin;
1012
import org.hibernate.boot.jaxb.hbm.spi.EntityInfo;
1113
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping;
@@ -64,7 +66,7 @@ public MappingDocument(
6466
.setImplicitCatalogName( documentRoot.getCatalog() )
6567
.setImplicitPackageName( documentRoot.getPackage() )
6668
.setImplicitPropertyAccessorName( documentRoot.getDefaultAccess() )
67-
// .setImplicitCascadeStyleName( documentRoot.getDefaultCascade() )
69+
.setImplicitCascadeTypes( getCascadeTypes(documentRoot) )
6870
.setEntitiesImplicitlyLazy( documentRoot.isDefaultLazy() )
6971
.setAutoImportEnabled( documentRoot.isAutoImport() )
7072
.setPluralAttributesImplicitlyLazy( documentRoot.isDefaultLazy() )
@@ -76,6 +78,23 @@ public MappingDocument(
7678
new TypeDefinitionRegistryStandardImpl( rootBuildingContext.getTypeDefinitionRegistry() );
7779
}
7880

81+
private EnumSet<CascadeType> getCascadeTypes(JaxbHbmHibernateMapping documentRoot) {
82+
return switch ( documentRoot.getDefaultCascade() ) {
83+
case "all" -> EnumSet.of( CascadeType.ALL );
84+
case "all-delete-orphan" -> EnumSet.of( CascadeType.ALL, CascadeType.DELETE_ORPHAN );
85+
case "persist" -> EnumSet.of( CascadeType.PERSIST );
86+
case "merge" -> EnumSet.of( CascadeType.MERGE );
87+
case "lock" -> EnumSet.of( CascadeType.LOCK );
88+
case "refresh" -> EnumSet.of( CascadeType.REFRESH );
89+
case "replicate" -> EnumSet.of( CascadeType.REPLICATE );
90+
case "evict" -> EnumSet.of( CascadeType.DETACH );
91+
case "delete" -> EnumSet.of( CascadeType.REMOVE );
92+
case "remove" -> EnumSet.of( CascadeType.REMOVE );
93+
case "delete-orphan" -> EnumSet.of( CascadeType.DELETE_ORPHAN );
94+
default -> null;
95+
};
96+
}
97+
7998
public JaxbHbmHibernateMapping getDocumentRoot() {
8099
return documentRoot;
81100
}

hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2226,7 +2226,7 @@ private String toCascadeString(EnumSet<CascadeType> defaultCascadeTypes) {
22262226
else {
22272227
buffer.append( ", " );
22282228
}
2229-
buffer.append( cascadeType.name().toLowerCase( Locale.ROOT ) );
2229+
buffer.append( cascadeType.name().toLowerCase( Locale.ROOT ).replace( '_', '-' ) );
22302230
}
22312231
return buffer.toString();
22322232
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.hbm.cascade;
6+
7+
import org.hibernate.boot.Metadata;
8+
import org.hibernate.boot.MetadataSources;
9+
import org.hibernate.boot.registry.StandardServiceRegistry;
10+
import org.hibernate.mapping.PersistentClass;
11+
import org.hibernate.orm.test.legacy.Holder;
12+
import org.hibernate.testing.ServiceRegistryBuilder;
13+
import org.hibernate.testing.orm.junit.BaseUnitTest;
14+
import org.junit.jupiter.api.Test;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
18+
@BaseUnitTest
19+
class DefaultCascadeBindingTest {
20+
21+
@Test
22+
void testDefaultCascadeIsApplied() {
23+
StandardServiceRegistry ssr = ServiceRegistryBuilder.buildServiceRegistry();
24+
25+
try {
26+
MetadataSources ms = new MetadataSources( ssr );
27+
ms.addResource( "org/hibernate/orm/test/hbm/cascade/default-cascade.hbm.xml" );
28+
29+
Metadata metadata = ms.buildMetadata();
30+
31+
PersistentClass entityBinding = metadata.getEntityBinding( Holder.class.getName() );
32+
33+
// Default cascade
34+
assertThat( entityBinding.getProperty( "ones" ).getCascadeStyle() )
35+
.hasToString( "[STYLE_ALL,STYLE_DELETE_ORPHAN]" );
36+
37+
// Explicit cascade
38+
assertThat( entityBinding.getProperty( "fooArray" ).getCascadeStyle() )
39+
.hasToString( "STYLE_PERSIST" );
40+
}
41+
finally {
42+
ServiceRegistryBuilder.destroy( ssr );
43+
}
44+
}
45+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping"
3+
default-cascade="all-delete-orphan">
4+
5+
<class name="org.hibernate.orm.test.legacy.Holder">
6+
<id name="id" column="id_" type="string" length="32" unsaved-value="null">
7+
<generator class="uuid.hex"/>
8+
</id>
9+
10+
<!-- Default cascade is "all-delete-orphan" -->
11+
<list name="ones">
12+
<key column="holder"/>
13+
<index column="i"/>
14+
<one-to-many class="org.hibernate.orm.test.legacy.One"/>
15+
</list>
16+
17+
<array name="fooArray" cascade="persist">
18+
<key column="holder1"/>
19+
<index column="j1"/>
20+
<one-to-many class="org.hibernate.orm.test.legacy.Foo"/>
21+
</array>
22+
</class>
23+
24+
<class name="org.hibernate.orm.test.legacy.One" table="one">
25+
<id name="key" column="one_key">
26+
<generator class="native" />
27+
</id>
28+
</class>
29+
30+
<class name="org.hibernate.orm.test.legacy.Foo" table="foo">
31+
<id name="key" column="one_key">
32+
<generator class="native" />
33+
</id>
34+
</class>
35+
</hibernate-mapping>

0 commit comments

Comments
 (0)