Blazebit / blaze-persistence

Rich Criteria API for JPA providers
https://persistence.blazebit.com
Apache License 2.0
697 stars 85 forks source link

Hibernate Entity containing elementcollection of embeddables having embeddable crashes in HibernateJpaProvider #1886

Open rmschots opened 1 month ago

rmschots commented 1 month ago

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.(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.(EntityMetamodelImpl.java:127) ~[blaze-persistence-core-impl-jakarta-1.6.11.jar:1.6.11] at com.blazebit.persistence.impl.CriteriaBuilderFactoryImpl.(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() ~[classes/:na] at com.rmschots.blazedemo.config.BlazePersistenceConfiguration$$SpringCGLIB$$FastClass$$1.invoke() ~[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() ~[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](https://github.com/Blazebit/blaze-persistence/assets/2806802/3292763a-65fa-4ed9-9171-6b73bcc7b2b6)
![image](https://github.com/Blazebit/blaze-persistence/assets/2806802/83507137-d4fa-4ed6-88fc-ed15e6036a63)

### 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
beikov commented 1 month ago

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