I have problem with nested embedded objects in Hibernate 6.1.4.Final (Java 17, Spring-Data 3.0.0-M5) which I stripped down to the following lines of code
@Entity
public class Foo{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;
@Embedded
private Bar1 embeddedBar1;
//Getters and Setters omitted
}
@Embeddable
public class Bar1 {
@Embedded
private Bar2 embeddedBar2;
//Getters and Setters omitted
}
@Embeddable
public class Bar2 {
private String bar;
private String test;
//Getters and Setters omitted
}
The corresponding test looks like
@DataJpaTest
public class FooRepositoryTest {
@Autowired
private TestEntityManager em;
@Test
public void myTest() throws Exception {
Foo foo = em.persist(new Foo());
assertThat(foo).isNotNull();
em.merge(foo);
TypedQuery<Foo> qry = em.getEntityManager().createQuery("SELECT f from Foo f where f.id=:id", Foo.class);
qry.setParameter("id", foo.getId());
EntityGraph<Foo> g = em.getEntityManager().createEntityGraph(Foo.class);
//Setting the EntityGraph will lead to an error
qry.setHint("jakarta.persistence.fetchgraph", g);
List<Foo> ff = qry.getResultList();
assertThat(ff).isNotEmpty();
}
}
The resulting stacktrace will lead to an ArrayIndexOutOfBoundsException
Caused by: org.hibernate.HibernateException: Could not generate fetch : testfoo.Foo(f).embeddedBar1.embeddedBar2 -> test
at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.buildFetch(BaseSqmToSqlAstConverter.java:7207)
at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.addFetch(BaseSqmToSqlAstConverter.java:7059)
at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.lambda$visitFetches$130(BaseSqmToSqlAstConverter.java:7109)
at java.base@17/java.util.ArrayList.forEach(ArrayList.java:1511)
at app//org.hibernate.metamodel.mapping.internal.EmbeddableMappingTypeImpl.visitAttributeMappings(EmbeddableMappingTypeImpl.java:726)
at app//org.hibernate.metamodel.mapping.internal.EmbeddableMappingTypeImpl.visitSubParts(EmbeddableMappingTypeImpl.java:736)
at app//org.hibernate.metamodel.mapping.internal.EmbeddedAttributeMapping.visitSubParts(EmbeddedAttributeMapping.java:292)
at app//org.hibernate.sql.results.graph.FetchableContainer.visitFetchables(FetchableContainer.java:35)
at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitFetches(BaseSqmToSqlAstConverter.java:7109)
at app//org.hibernate.sql.results.graph.AbstractFetchParent.afterInitialize(AbstractFetchParent.java:32)
at app//org.hibernate.sql.results.graph.embeddable.internal.EmbeddableFetchImpl.<init>(EmbeddableFetchImpl.java:75)
at app//org.hibernate.metamodel.mapping.internal.EmbeddedAttributeMapping.generateFetch(EmbeddedAttributeMapping.java:238)
at app//org.hibernate.sql.results.graph.FetchParent.generateFetchableFetch(FetchParent.java:105)
at app//org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.buildFetch(BaseSqmToSqlAstConverter.java:7148)
... 126 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at org.hibernate.metamodel.mapping.internal.BasicAttributeMapping.generateFetch(BasicAttributeMapping.java:310)
at org.hibernate.sql.results.graph.FetchParent.generateFetchableFetch(FetchParent.java:105)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.buildFetch(BaseSqmToSqlAstConverter.java:7148)
... 139 more
Thanks in advance for any help or contribution to this problem.