Мы переводим нашу систему Shopsystem с Hibernate 4.3.10 на Hibernate 5.3.13 и испытываем проблемы с некоторыми JPQL. Это наши сущности:
@Entity
public abstract class Order extends Domain implements Serializable {
public abstract List<? extends OrderPosition> getPositions();
}
@Entity
public class CustomerOrder extends Order implements Serializable {
@OneToMany( mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY )
private List<CustomerOrderPosition> positions = new ArrayList<CustomerOrderPosition>();
@Override
public List<CustomerOrderPosition> getPositions() {
return this.positions;
}
}
@Entity
public abstract class OrderPosition extends Domain implements Serializable {
public abstract Order getOrder();
}
@Entity
public class CustomerOrderPosition extends OrderPosition {
@ManyToOne( optional = false, fetch = FetchType.LAZY )
private CustomerOrder order;
@Override
public CustomerOrder getOrder() {
return order;
}
}
Домен - это сопоставленный суперкласс всех сущностей (с идентификатором и версией). JPQL, который терпит неудачу, похож на
SELECT o FROM Order o JOIN o.positions pos WHERE pos.id = :id
. Мы пытаемся получить доступ к свойству "позиции" абстрактного класса. Да, я знаю, что это свойство не существует, однако все подклассы (отображается только CustomerOrder) имеют это свойство. Это не было проблемой с Hibernate 4. Hibernate использовал свойство подклассов в дополнительном выборе. Теперь это не в состоянии
ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 83) MSC000001: Failed to start service jboss.persistenceunit."com.xxx.server.ear/com.xxx.server.jar#xxx": org.jboss.msc.service.StartException in service jboss.persistenceunit."com.xxx.server.ear/com.xxx.server.jar#xxx": javax.persistence.PersistenceException: [PersistenceUnit: xxx] Unable to build Hibernate SessionFactory
at org.jboss.as.jpa@18.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:198)
at org.jboss.as.jpa@18.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:128)
at org.wildfly.security.elytron-private@1.10.4.Final//org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:658)
at org.jboss.as.jpa@18.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:212)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.base/java.lang.Thread.run(Thread.java:834)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.JBossThread.run(JBossThread.java:485)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: xxx] Unable to build Hibernate SessionFactory
at org.hibernate@5.3.13.Final//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1016)
at org.hibernate@5.3.13.Final//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:942)
at org.hibernate.jipijapa-hibernate5-3@18.0.1.Final//org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
at org.jboss.as.jpa@18.0.1.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:170)
... 9 more
Caused by: org.hibernate.HibernateException: Errors in named queries:
OrderPosition.FIND_BY_ID failed because of: org.hibernate.QueryException: could not resolve property: positions of: com.xxx.domain.Order [SELECT o FROM com.xxx.domain.Order o JOIN o.positions pos WHERE pos.id = :id]
at org.hibernate@5.3.13.Final//org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:335)
at org.hibernate@5.3.13.Final//org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
at org.hibernate@5.3.13.Final//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)
... 11 more
Каков будет правильный способ моделирования отношений сущностей? Почему это терпит неудачу в Hibernate 5, есть ли конфигурация, которая разрешает такого рода запросы, обращаясь к свойствам подклассов? Я проверил аннотации, такие как AssociationOverride или AttributeOverride, но ни один из них не подходит.