【问题标题】:NamedQuery defined in DAO annotation not found by Hibernate session factoryHibernate 会话工厂未找到在 DAO 注释中定义的 NamedQuery
【发布时间】:2011-10-13 15:53:04
【问题描述】:

我使用 Spring 和 Hibernate。在我的 DAO 中,我定义了一个会话工厂找不到的 NamedQuery,尽管我已将该 DAO 的包添加到 packagesToScan。

我的 DAO:

/**
 * 
 */
package org.lalala.service.mytest;

import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;


import  org.lalala.objects.Unit;


@NamedQueries
({
    @NamedQuery
    (
        name="unit.findById",
        query="from Unit u where u.unitid = :unitId"
    )
})
public class MyTestDaoImpl implements MyTestDao
{

    private SessionFactory sessionFactory;


    public MyTestDaoImpl(SessionFactory sessionFactory)
    {
        super();
        this.sessionFactory = sessionFactory;
    }



    /* (non-Javadoc)
     * @see org.lalala.service.mytest.MyTestDao#getRandomUnit()
     */
    @Override
    public Unit getRandomUnit()
    {
        long unitid = 2891;
        try {
            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();

            Query query = session.getNamedQuery("unit.findById");
            query.setParameter("unitId", unitid);

            Unit unit = (Unit) query.uniqueResult();

            session.getTransaction().commit();

            return unit;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
    }    

}

这里是提供会话工厂的 Spring config 方法:

@Bean
public AnnotationSessionFactoryBean  getSessionFactory() {
    final AnnotationSessionFactoryBean  sessionFactory = new  AnnotationSessionFactoryBean ();
    sessionFactory.setDataSource(getDataSource());

    String[] packages = new String[]{"org.lalala.avalon.service.mytest"};

    sessionFactory.setAnnotatedPackages(packages);

    Properties properties = new Properties();
    properties.put("hibernate.current_session_context_class", "thread");
    sessionFactory.setHibernateProperties(properties);

    return sessionFactory;
}

这里抛出的异常:

org.hibernate.MappingException: Named query not known: unit.findById

由于一些类似的 stackoverflow 问题,我将 hibernate @NamedQuery 注释替换为 JPA 等效注释。没有帮助。

【问题讨论】:

    标签: hibernate spring jpa hibernate-annotations named-query


    【解决方案1】:

    您必须将命名查询放在您的实体上,而不是放在 dao 上

    here is an example

    【讨论】:

    • 谢谢,我记得在过去的 JEE 项目中将它们放在 DAO 中,但我记错了。
    • 尽管如此,我认为在 DAO 中允许 NamedQueries 是有意义的。有时,它们会变得相当复杂,并且支持(作为一部分)某些业务逻辑用例,这些用例可能不够通用,无法将其放入实体中。也可能是,您作为开发人员拥有第三方实体,并且您想编写具有特定获取策略的 DAO。最后,NamedQuery 可以跨越多个实体类,在哪个实体类中定义它并不明显
    【解决方案2】:

    如果您使用@MappedSuperclass 注释您的DAO,那么您可以将您的NamedQueries 放入DAO。不要忘记将 DAO 的包或 DAO 类本身添加到带注释的包/类列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2016-12-25
      • 2013-07-28
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多