从Hibernate 4.3迁移到Hibernate 5.1.16时出现了QuerySyntaxException

3
我正在尝试将我的hibernate 4.3迁移到hibernate 5.1.16,但是一周后我仍然无法解决QuerySyntaxException问题。
我使用注释进行映射,并检查了我的查询,所有查询都使用相同的实体类名称,我确定没有名称冲突,并且在Hibernate 4.3中它可以正常工作。
网络上的所有解决方案都只涉及命名冲突。__Maintence是我的第一个表,映射问题指向该表。
这是我用于映射的hibernate.cfg
<mapping class="wadetech.DB.entity.__Maintenance"/>

这是我的 __Maintenance 类。

@Entity
@Table(name = "__maintenance", uniqueConstraints = @UniqueConstraint(columnNames = "name"))
public class __Maintenance implements java.io.Serializable {

This is my __MaintenanceDAO

public Collection<__Maintenance> getMaintenanceByName(String name){
    String query = "";
    query += "select m from __Maintenance m";
    query += "  where m.name = :name ";
    query += " order by ";
    query += "   m.startDate desc, m.idMaintenance desc";
    return super.list(query, "name", name);
}

以下是我的异常情况


 wadetech.exceptions.InfrastructureException: org.hibernate.hql.internal.ast.QuerySyntaxException: __Maintenance is not mapped [select m from __Maintenance m  where m.name = :name  order by    m.startDate desc, m.idMaintenance desc]
    at wadetech.DB.base.BaseDAO.anonymousFindByQuery(BaseDAO.java:267)
    at wadetech.DB.base.BaseDAO.findByQuery(BaseDAO.java:255)
    at wadetech.DB.base.BaseDAO.list(BaseDAO.java:243)
    at wadetech.DB.DAOS.__MaintenanceDAO.getMaintenanceByName(__MaintenanceDAO.java:78)
    at com.at.project.utils.runtime.RuntimeModifier.HasExecuted(RuntimeModifier.java:128)
    at wadetech.listeners.ModificationScriptStartupListener.contextInitialized(ModificationScriptStartupListener.java:47)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5016)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5528)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: __Maintenance is not mapped [select m from __Maintenance m  where m.name = :name  order by    m.startDate desc, m.idMaintenance desc]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:217)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76) 

我也添加了一个关于我的HibernateUtil的部分,因为我怀疑这是由于一些事务问题导致的,我在移动到5.1后进行了更改。
在此之前,我使用了tx.wasCommitted(); 现在我不能再使用它了,因为hibernate 5.1中删除了was Committed,所以我将其更改为以下代码:tx.getStatus() == TransactionStatus.COMMITTED 这是我的hibernateUtil
public static void beginTransaction(boolean readOnly) throws InfrastructureException {

    try {
        if( currentConnectionMode == ConnectionMode.MASTER_SLAVE && readOnly ) {
            // it is a readOnly tx
            Transaction tx = readOnlyThreadTransaction.get();
            if (null == tx || tx.getStatus() == TransactionStatus.COMMITTED || tx.getStatus() == TransactionStatus.ROLLED_BACK) {
                tx = getReadOnlySession().beginTransaction();
                readOnlyThreadTransaction.set(tx);
            }
        } else {
            Transaction tx = threadTransaction.get();
            if (null == tx || tx.getStatus() == TransactionStatus.COMMITTED || tx.getStatus() == TransactionStatus.ROLLED_BACK) {
                tx = getSession().beginTransaction();
                threadTransaction.set(tx);
            }
        } // end if
    } // end try
    catch (HibernateException ex) {
        WLog.DAOLogger.error("Begin transaction", ex);
        throw new InfrastructureException(ex);
    } // end catch
}

我想坚持使用hibernate 5.1,不想迁移到hibernate 5.2,因为5.2需要使用jdk 8+。我更喜欢hibernate 5.1,因为我严格需要使用jdk 1.7。


@Dushyant Tankariya,你了解我的帖子吗?这将会很有帮助,谢谢。 - Lilac
不确定,但你可以看一下StackOverflow的一个问题 - Dushyant Tankariya
我想继续使用jdk 1.7,所以我选择了hibernate 5.1,因为所有上述版本的hibernate 5.1.16都使用jdk 1.8。我只有这个映射问题需要解决。谢谢。 - Lilac
然后,您应该编辑您的问题以指定您要保留相同的JDK版本。 - Sterconium
@Sterconium 好的,谢谢。 - Lilac
显示剩余3条评论
1个回答

2

所以最终我解决了上述问题。尽管异常没有帮助指出问题所在,但真正的问题出在了hibernateUtils上。 在此之前,我的hiberenate utils是针对hibernate 4.3的。

serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
                        configuration.getProperties()).build();
                sessionFactory = configuration.configure().buildSessionFactory(serviceRegistry);

我把它改成了

registry = new StandardServiceRegistryBuilder().configure().build();
                 MetadataSources sources = new MetadataSources(registry);
                 Metadata metadata = sources.getMetadataBuilder().build();
                 sessionFactory = metadata.getSessionFactoryBuilder().build();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接