NamedQuery, определенный в аннотации DAO, не найден фабрикой сеансов Hibernate

Я использую Spring вместе с Hibernate. В моем DAO я определил NamedQuery, который не найден фабрикой сеансов, хотя я добавил пакет этого DAO в packagesToScan.

Мой ДАО:

/**
 * 
 */
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 для предоставления фабрики сеансов:

@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

Из-за некоторых похожих вопросов о переполнении стека я заменил аннотацию hibernate @NamedQuery эквивалентом JPA. Не помогло.


person rainer198    schedule 13.10.2011    source источник


Ответы (2)


вы должны поместить именованные запросы в свою сущность, а не в дао

вот пример

person NimChimpsky    schedule 13.10.2011
comment
Спасибо, я вспомнил, что поместил их в DAO в прошлом проекте JEE, но я ошибся. - person rainer198; 14.10.2011
comment
Тем не менее, я думаю, было бы разумно разрешить NamedQueries в DAO. Иногда они становятся довольно сложными и поддерживают (являются частью) некоторые варианты использования бизнес-логики, которые могут быть недостаточно общими, чтобы поместить их в сущность. Также может быть, что у вас как у разработчика есть сторонние объекты, и вы хотите написать DAO с определенными стратегиями выборки. Наконец, NamedQuery может относиться к нескольким классам сущностей, и не очевидно, в каком из них его определить. - person rainer198; 14.10.2011

Если вы аннотируете свой DAO с помощью @MappedSuperclass, вы можете поместить свои NamedQueries в DAO. Не забудьте добавить пакет DAO или сам DAO-класс в список аннотированных пакетов/классов.

person Hans    schedule 24.11.2011