【问题标题】:spring rest service - hibernate dao - annotations - pojo - namedqueriesspring rest 服务 - hibernate dao - 注释 - pojo - 命名查询
【发布时间】:2013-10-17 18:37:44
【问题描述】:

我有一个 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;
     ...........

我必须从服务层方法内部访问这个命名查询的结果。 所以我尝试将休眠会话工厂自动装配到服务层类中。

@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 接口或类。

【问题讨论】:

    标签: hibernate spring-mvc annotations named-query


    【解决方案1】:

    在您的方法中,您实际上没有 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

    【讨论】:

    • 这种组合方法怎么样 - 有一个 GenericDAO - 有一个实现 GenericDAO 的接口 IMyTableDAO - 但没有任何 MyTableDAOImpl。
    • @user811433 看看spring-data-jpa,这正是你描述的原因。
    • 您将需要 MyTableDAOImpl NamedQuery("abc") 通常特定于您的实体或某些基本实体。它不会被 GenericDAOImpl 引用
    • 是的 spring-data-jpa 已经正式确定了这种方法。我没有使用 spring-data-jpa,但它看起来很有希望。
    • @user811433 sprtng-data-jpa 根据您编写的单个接口生成所有 DAO(spring 词汇中的存储库)。那么它是建立在 spring 和 JPA 之上的吗?因此完全独立于 ORM 提供程序(在您的情况下为休眠)。
    【解决方案2】:

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

    【讨论】:

    • 如果我添加一个 MyTableDao 接口,这不会违背拥有命名查询的目的吗?
    • 根据设计,您应该在界面中为您的命名查询公开一个方法。此方法将使用 namedQuery 并检索结果并相应地发送。对于单个命名查询,您的方法可以正常工作。但是考虑未来,如果您有多个命名查询,并且所有方法都在一个地方调用命名查询将有所帮助。也可能存在您希望过滤掉在命名查询中收到的一些数据的情况,而 dao 类将是实现可读性目的的理想场所
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2014-07-11
    • 2012-01-04
    • 2013-11-03
    相关资源
    最近更新 更多