Миграция Hibernate, JPQL на абстрактный класс - PullRequest
0 голосов
/ 25 февраля 2020

Мы переводим нашу систему 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, но ни один из них не подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...