spring rest service - hibernate dao - annotations - pojo - namedqueries

时间:2013-10-10 06:15:24

标签: hibernate spring-mvc annotations named-query

我有一个pojo,其中包含一些命名查询以获取数据。

@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层逻辑。 这是访问命名查询的正确方法吗?

注意:我没有上面的MyTable类的DAO接口或类。

2 个答案:

答案 0 :(得分:0)

是的,您的服务类中有DAO层逻辑。更好的设计是使用MyTableDao接口,该接口公开了可用于从MyTable检索数据的各种方法。

答案 1 :(得分: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