Hibernate Entity containing elementcollection of embeddables having embeddable crashes in HibernateJpaProvider
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:
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
Thanks for the report. We'll try to look into this as soon as possible.