@JoinFormula в Hibernate для получения списка дочерних объектов вызывает ClassCastException - PullRequest
0 голосов
/ 04 октября 2019

Я столкнулся с проблемой, которая возникает при попытке использовать аннотацию @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 игнорирует эту ошибку .

...