弹簧安置服务 - 休眠道 - 注解 - POJO - namedqueries(spring

2019-10-18 18:19发布

我有一个包含几个命名查询来获得数据的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的Session工厂自动装配到服务层类。

@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的类。

Answer 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()

  }

具有命名查询的目的是,他们被编译并验证在应用程序启动时间见休眠命名查询的优点?

我建议你会考虑GenericDAO模式



Answer 2:

是的,你是在你的服务类DAO层逻辑。 更好的设计是有一个MyTableDao接口暴露其可用于从MyTable的检索数据的各种方法。



文章来源: spring rest service - hibernate dao - annotations - pojo - namedqueries