2013-10-10 5 views
1

У меня есть pojo, которое содержит несколько именованных запросов для получения данных.служба весеннего отдыха - hibernate dao - аннотации - pojo - namedqueries

@NamedQueries({ 
    @NamedQuery(name="abc", query="test") 
}) 
@Entity 
@Table(name = "MY_TABLE") 
public class MyTable implements java.io.Serializable{ 
    private long id; 
    private String name; 
    ........... 

Мне нужно получить результат этого именованного запроса из метода служебного слоя. Итак, я попытался авторизовать фабрику сеансов hibernate в классе уровня обслуживания.

@Service 
public class MyServiceClass{ 
    @Autowired 
    SessionFactory sessionFactory; 
    .......... 
    public void myMethod() { 
     Session session = acceSessionFactory.getCurrentSession(); 
     Query query = session.getNamedQuery("abc").setInteger("id", 1).setString("name", "testname"); 
     MyTable mytablerow = (MyTable) query.uniqueResult(); 
      ....... 
    } 

Однако в приведенном выше подходе - я думаю, что мы имеем логику уровня dao в слое обслуживания. Является ли это правильным способом доступа к именованным запросам?

Примечание: У меня нет класса или класса DAO для класса MyTable выше.

ответ

0

В вашем подходе вы фактически не имеете слоя DAO.
Общий подход для обслуживания слоя с DAO будет

@NamedQueries({ 
    @NamedQuery(name="abc", query="test") 
}) 
@Entity 
@Table(name = "MY_TABLE") 
public class MyTable 


@Repository 
public class MyTableDAOImpl implements MyTableDAO 

    @Autowire 
    protected SessionFactory sessionFactory; 
    public MyTable myMethod1() { 
     Query query = session.getNamedQuery("abc") 
     .setInteger("id",1).setString("name", "testname"); 
     return (MyTable) query.uniqueResult();} 

    public MyTable myMethod2() { ...} 


@Service 
public class MyTableServiceImpl implements MyTableService 
    @Autowire 
    protected MyTableDAO myTableDAO; 


    public MyTable myMethodService() { 
     //Some logic 
     ... 
     return myTableDAO.myMethod1() 

    } 

Цель наличия именованных запросов является то, что они составляются и проверяются на время запуска приложения См. Advantages of Named queries in hibernate?

Я полагаю, что вы будете рассматривать GenericDAO pattern

+0

Как насчет этого комбинированного подхода - иметь GenericDAO - иметь интерфейс IMyTableDAO, который реализует GenericDAO - но не имеет MyTableDAOImpl. – user811433

+0

@ user811433 Посмотрите на 'spring-data-jpa', именно поэтому вы описываете. – Kartoch

+0

Вам понадобится MyTableDAOImpl. NamedQuery («abc») обычно специфичен для вашей сущности или какого-то базового объекта. Он не будет рецензироваться из GenericDAOImpl –

0

Да, у вас есть логика уровня DAO в вашем классе обслуживания. Лучшим вариантом было бы иметь интерфейс MyTableDao, который предоставляет различные методы, которые можно использовать для извлечения данных из MyTable.

+0

Если добавить интерфейс MyTableDao, разве это не противоречит цели, имеющие namedqueries? – user811433

+0

В соответствии с проектом вы должны выставить метод в своем интерфейсе для вашего именованного запроса. Этот метод будет использовать namedQuery и получить результаты и отправить соответственно. Для одного и того же запроса ваш подход будет работать нормально. Но думать о будущем, если у вас есть несколько именованных запросов, имеющих все методы, вызывающие именованный запрос в одном месте, поможет. Также могут быть сценарии, в которых вы хотите отфильтровать некоторые данные, которые вы получили в именованном запросе, и класс dao был бы идеальным местом для этого для цели удобочитаемости. –

Смежные вопросы