blaze-persistence icon indicating copy to clipboard operation
blaze-persistence copied to clipboard

Hibernate Entity containing elementcollection of embeddables having embeddable crashes in HibernateJpaProvider

Open rmschots opened this issue 1 year ago • 1 comments

Description

In a spring boot environment, when creating an entity with an elementcollection of embeddables that have an embeddable, I'm getting an error when running the application. I encounter this error when creating a project from the spring boot archetype, and adapting it to spring boot 3.2.4, replacing javax with jakarta, and creating a simple entity structure:

Organization has many OrganizationBankAccount as ElementCollection OrganizationBankAccount has an Embedded SwiftCode SwiftCode contains a single String field

@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Organization {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private UUID id;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "organization_bank_account", joinColumns = @JoinColumn(name = "organization_id"))
    @Builder.Default
    @Setter(AccessLevel.PRIVATE)
    private Set<OrganizationBankAccount> bankAccounts = new HashSet<>();
}

@Embeddable
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrganizationBankAccount {
    @Embedded
    @AttributeOverride(name = "value", column = @Column(name = "swift_code"))
    private SwiftCode swiftCode;
}

@Getter
@Setter
@Embeddable
@ToString
@EqualsAndHashCode
public class SwiftCode {
    private String value;

    public static SwiftCode of(String swiftCode) {
        return new SwiftCode(swiftCode);
    }

    protected SwiftCode() {
    }

    private SwiftCode(String swiftCode) {
        this.value = swiftCode;
    }
}

Expected behavior

The blaze persistence should allow this kind of structure without crashing

Actual behavior

java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.hibernate.type.ComponentType.getCascadeStyle(ComponentType.java:564) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
	at com.blazebit.persistence.integration.hibernate.base.HibernateJpaProvider.isOrphanRemoval(HibernateJpaProvider.java:1275) ~[blaze-persistence-integration-hibernate6-base-1.6.11.jar:1.6.11]
	at com.blazebit.persistence.impl.EntityMetamodelImpl$AttributeEntry.<init>(EntityMetamodelImpl.java:1057) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11]
	at com.blazebit.persistence.impl.EntityMetamodelImpl.collectColumnNames(EntityMetamodelImpl.java:418) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11]
	at com.blazebit.persistence.impl.EntityMetamodelImpl.collectColumnNames(EntityMetamodelImpl.java:357) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11]
	at com.blazebit.persistence.impl.EntityMetamodelImpl.collectColumnNames(EntityMetamodelImpl.java:378) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11]
	at com.blazebit.persistence.impl.EntityMetamodelImpl.<init>(EntityMetamodelImpl.java:127) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11]
	at com.blazebit.persistence.impl.CriteriaBuilderFactoryImpl.<init>(CriteriaBuilderFactoryImpl.java:110) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11]
	at com.blazebit.persistence.impl.CriteriaBuilderConfigurationImpl.createCriteriaBuilderFactory(CriteriaBuilderConfigurationImpl.java:2140) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11]
	at com.rmschots.blazedemo.config.BlazePersistenceConfiguration.createCriteriaBuilderFactory(BlazePersistenceConfiguration.java:48) ~[classes/:na]
	at com.rmschots.blazedemo.config.BlazePersistenceConfiguration$$SpringCGLIB$$0.CGLIB$createCriteriaBuilderFactory$1(<generated>) ~[classes/:na]
	at com.rmschots.blazedemo.config.BlazePersistenceConfiguration$$SpringCGLIB$$FastClass$$1.invoke(<generated>) ~[classes/:na]
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[spring-core-6.1.5.jar:6.1.5]
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-6.1.5.jar:6.1.5]
	at com.rmschots.blazedemo.config.BlazePersistenceConfiguration$$SpringCGLIB$$0.createCriteriaBuilderFactory(<generated>) ~[classes/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140) ~[spring-beans-6.1.5.jar:6.1.5]

debug details right before the crash: image image

Steps to reproduce

check out my sample repo and run the application: https://github.com/rmschots/blaze-persistence-demo

Environment

Version: 1.6.11 JPA-Provider: Hibernate 6.4 DBMS: H2 Application Server: Spring boot 3.2.4

FYI: I had the same problem when I was using Spring 3.1 and Hibernate 6.2

rmschots avatar Apr 04 '24 09:04 rmschots

Thanks for the report. We'll try to look into this as soon as possible.

beikov avatar Apr 08 '24 11:04 beikov