Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public static class Builder {
private String implicitDiscriminatorColumnName;
private String implicitPackageName;
private boolean autoImportEnabled;
private final EnumSet<CascadeType> implicitCascadeTypes;
private EnumSet<CascadeType> implicitCascadeTypes;
private jakarta.persistence.AccessType implicitPropertyAccessType;
private String implicitPropertyAccessorName;
private boolean entitiesImplicitlyLazy;
Expand Down Expand Up @@ -229,12 +229,12 @@ public Builder setAutoImportEnabled(boolean autoImportEnabled) {
return this;
}

// public Builder setImplicitCascadeStyleName(String implicitCascadeStyleName) {
// if ( StringHelper.isNotEmpty( implicitCascadeStyleName ) ) {
// this.implicitCascadeStyleName = implicitCascadeStyleName;
// }
// return this;
// }
public Builder setImplicitCascadeTypes(EnumSet<CascadeType> implicitCascadeTypes) {
if (implicitCascadeTypes != null) {
this.implicitCascadeTypes = implicitCascadeTypes;
}
return this;
}

public Builder setImplicitPropertyAccessType(jakarta.persistence.AccessType accessType) {
if ( accessType != null ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
*/
package org.hibernate.boot.model.source.internal.hbm;

import java.util.EnumSet;
import java.util.Set;

import org.hibernate.annotations.CascadeType;
import org.hibernate.boot.jaxb.Origin;
import org.hibernate.boot.jaxb.hbm.spi.EntityInfo;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping;
Expand Down Expand Up @@ -64,7 +66,7 @@ public MappingDocument(
.setImplicitCatalogName( documentRoot.getCatalog() )
.setImplicitPackageName( documentRoot.getPackage() )
.setImplicitPropertyAccessorName( documentRoot.getDefaultAccess() )
// .setImplicitCascadeStyleName( documentRoot.getDefaultCascade() )
.setImplicitCascadeTypes( getCascadeTypes(documentRoot) )
.setEntitiesImplicitlyLazy( documentRoot.isDefaultLazy() )
.setAutoImportEnabled( documentRoot.isAutoImport() )
.setPluralAttributesImplicitlyLazy( documentRoot.isDefaultLazy() )
Expand All @@ -76,6 +78,23 @@ public MappingDocument(
new TypeDefinitionRegistryStandardImpl( rootBuildingContext.getTypeDefinitionRegistry() );
}

private EnumSet<CascadeType> getCascadeTypes(JaxbHbmHibernateMapping documentRoot) {
return switch ( documentRoot.getDefaultCascade() ) {
case "all" -> EnumSet.of( CascadeType.ALL );
case "all-delete-orphan" -> EnumSet.of( CascadeType.ALL, CascadeType.DELETE_ORPHAN );
case "persist" -> EnumSet.of( CascadeType.PERSIST );
case "merge" -> EnumSet.of( CascadeType.MERGE );
case "lock" -> EnumSet.of( CascadeType.LOCK );
case "refresh" -> EnumSet.of( CascadeType.REFRESH );
case "replicate" -> EnumSet.of( CascadeType.REPLICATE );
case "evict" -> EnumSet.of( CascadeType.DETACH );
case "delete" -> EnumSet.of( CascadeType.REMOVE );
case "remove" -> EnumSet.of( CascadeType.REMOVE );
case "delete-orphan" -> EnumSet.of( CascadeType.DELETE_ORPHAN );
default -> null;
};
}

public JaxbHbmHibernateMapping getDocumentRoot() {
return documentRoot;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2226,7 +2226,7 @@ private String toCascadeString(EnumSet<CascadeType> defaultCascadeTypes) {
else {
buffer.append( ", " );
}
buffer.append( cascadeType.name().toLowerCase( Locale.ROOT ) );
buffer.append( cascadeType.name().toLowerCase( Locale.ROOT ).replace( '_', '-' ) );
}
return buffer.toString();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.orm.test.hbm.cascade;

import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.orm.test.legacy.Holder;
import org.hibernate.testing.ServiceRegistryBuilder;
import org.hibernate.testing.orm.junit.BaseUnitTest;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

@BaseUnitTest
class DefaultCascadeBindingTest {

@Test
void testDefaultCascadeIsApplied() {
StandardServiceRegistry ssr = ServiceRegistryBuilder.buildServiceRegistry();

try {
MetadataSources ms = new MetadataSources( ssr );
ms.addResource( "org/hibernate/orm/test/hbm/cascade/default-cascade.hbm.xml" );

Metadata metadata = ms.buildMetadata();

PersistentClass entityBinding = metadata.getEntityBinding( Holder.class.getName() );

// Default cascade
assertThat( entityBinding.getProperty( "ones" ).getCascadeStyle() )
.hasToString( "[STYLE_ALL,STYLE_DELETE_ORPHAN]" );

// Explicit cascade
assertThat( entityBinding.getProperty( "fooArray" ).getCascadeStyle() )
.hasToString( "STYLE_PERSIST" );
}
finally {
ServiceRegistryBuilder.destroy( ssr );
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping"
default-cascade="all-delete-orphan">

<class name="org.hibernate.orm.test.legacy.Holder">
<id name="id" column="id_" type="string" length="32" unsaved-value="null">
<generator class="uuid.hex"/>
</id>

<!-- Default cascade is "all-delete-orphan" -->
<list name="ones">
<key column="holder"/>
<index column="i"/>
<one-to-many class="org.hibernate.orm.test.legacy.One"/>
</list>

<array name="fooArray" cascade="persist">
<key column="holder1"/>
<index column="j1"/>
<one-to-many class="org.hibernate.orm.test.legacy.Foo"/>
</array>
</class>

<class name="org.hibernate.orm.test.legacy.One" table="one">
<id name="key" column="one_key">
<generator class="native" />
</id>
</class>

<class name="org.hibernate.orm.test.legacy.Foo" table="foo">
<id name="key" column="one_key">
<generator class="native" />
</id>
</class>
</hibernate-mapping>