设计一个Hibernate DAO

3
我正在使用以下代码。
 TestDAO {

    Session session = null;

    public TestDAO() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

   //...more code create,update ...
  //each method starts a transcation using  "tx= session.beginTransaction();"

1) 对于获取操作,我是否也应该使用tx.commit提交事务,还是只有保存/更新操作需要?

2) 我应该每次需要时创建TestDAO的单独实例吗?或者我应该创建一个单例类,每次返回一个DAO实例?这会有问题吗?


3
“分析二叉树的时间复杂度”这个标题与你的问题有什么关系? - NPE
抱歉,我不小心添加了那个。现在已经更改了。 - akshay
2个回答

3
  1. 在进行数据获取操作时,您不需要使用tx.commit()。这只在保存、更新或删除时需要。在数据获取后关闭会话。

  2. 如果您的应用程序只连接一个数据库,则使用单个DAO更好。Spring框架鼓励这样做。有关此内容的更多详细信息,请访问以下链接:

    不要重复使用DAO!


我正在使用HibernateUtil类从工厂中获取会话对象 [HibernateUtil.getSessionFactory().getCurrentSession()],我需要关闭会话吗? - akshay
@akshay:在单元操作后应该关闭会话。这里的单元操作指的是CRUD操作。因此,如果您获取数据,则步骤应为1.打开会话2.获取数据3.关闭会话。 - MAK Ripon

1

交易不应该是DAO的责任,这些交易需要在更高层面上进行控制。 DAO应该是一种查询和更新的东西,而不必意识到更大的画面,对DAO的调用可以在对象中分组,例如Spring服务或EJB会话bean,它负责决定什么需要在事务中放在一起。这使得您的DAO代码更具可重用性,因为它不必了解其操作环境。

看看Spring如何做到这一点(在Spring附带的示例应用程序中,例如petstore),或者更好地说,查看King / Bauer Hibernate-JPA书籍,其中有一章介绍如何创建DAO。


好的,如果我在DAO之外开始事务,那么我应该仅为更新/插入提交它还是也要为选择提交? - akshay
@nathan: 这本书是关于Java Persistence与Hibernate的吗?@http://www.amazon.com/Java-Persistence-Hibernate-Christian-Bauer/dp/1932394885 - akshay
@akshay:是的,你需要在某个时候关闭会话。有些人使用Servlet过滤器来打开和关闭会话。如果你还没有尝试过,我建议你去了解一下Spring,它可以让Hibernate会话管理变得轻松无痛。 - Nathan Hughes
@akshay:是的,那本书就是对于 Hibernate 的重要参考资料。 - Nathan Hughes
@akshay:它不应该有任何可变状态,因此可以是单例。顺便说一句,MAK Ripon答案中的链接是一个很好的示例,也要看看。 - Nathan Hughes
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接