Я столкнулся с проблемой, которая возникает при попытке использовать аннотацию @JoinFormula
для свойства @OneToMany
объекта.
Мне нужно отобразить дочерние элементы объекта с помощью пользовательского соединения (длятеперь, скажем, все дети, просто для упрощения предстоящего примера).
Моя попытка
В этом случае, что имеет смысл для меня, это сделать:
Подход A
Родительская сущность:
@Entity
@Table(name="parent")
public class Parent {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy="parent")
@JoinFormula(value="(SELECT * FROM child)")
private Set<Child> childs;
//getters, setters...
}
Дочерняя сущность:
@Entity
@Table(name="child")
public class Child {
@ManyToOne()
private Parent parent;
//Ids, getters, setters...
}
Таким образом, этот код хорошо работает, когда нет аннотации формулы соединения, но, когда это так, я получаю это при загрузке моего приложения Spring JPA:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate collection persister org.hibernate.persister.collection.OneToManyPersister
[...]
Caused by: java.lang.ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column
По сути, я хочу сделать this , но без возврата только одного ребенка, имея возможность вернутьсясписок потомков.
Мое исследование
Подход B
Родительский объект:
@Entity
@Table(name="parent")
public class Parent {
@OneToMany(mappedBy="parent")
private Set<Child> childs;
//Ids, getters, setters...
}
Дочерняя сущность:
@Entity
@Table(name="child")
public class Child {
@ManyToOne()
@JoinFormula(value="(SELECT * FROM parent)") //I guess you don't have to change the FROM clause. Tried both anyway.
private Parent parent;
//Ids, getters, setters...
}
Но это вызывает аналогичное исключение:
Exception in thread "main" java.lang.ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column
Согласно команда Hibernate это проблема с классом, связанным с Spring Boot.
Я открыл проблему в GitHub Spring Boot , и они повторили приведенный выше примербез участия какого-либо класса Spring Boot, и все равно происходит то же исключение, так что это определенно , а не проблема Spring , как они указывали.
Заключение.
Лично я заключаю, что hibernate игнорирует эту ошибку .