如何在struts2 + hibernate web-app中的多个dao方法中使用相同的会话对象?

时间:2014-11-17 12:44:06

标签: hibernate struts2

为了简单起见,我从下面的代码中省略了许多细节 我的实施是对的吗? 这种实施方式有任何缺点吗? 是否有更好的方法来实现相同的?

MyAction.java

class MyAction {
  public String execute() {
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();

    try {

      UserLoginDAO uldao = new UserLoginDAOImpl();
      uldao.firstMethod(session);
      List l = uldao.secondMethod(session);
      tx.commit();

    } catch(HibernateException ex) {
      if(tx != null) tx.rollback();
    } finally {
      session.close();
    }
    //statements
  }
}

UserLoginDAOImpl.java

class UserLoginDAOImpl implements UserLoginDAO{
  public void firstMethod(session) {
    //statements
    session.save(something);
  }

  public List secondMethod(session) {
    //statements
    List lst = session.createQuery("something").list(); 
    //statements
  }
}

UserLoginDAO.java

interface UserLoginDAO {
  public void firstMethod(session);
  public List secondMethod(session);
}

1 个答案:

答案 0 :(得分:1)

  

我的实施是否正确?

这是偏离主题的。顺便说一下,这似乎很好。

  

这种实施是否有任何缺点?

此实现称为Open Session In View(OSIV)模式,通常称为 Anti -Pattern。

proscons使用它(也是read this)。

  

有没有更好的方法来实现相同的?

更好是主观的,因此说哪个比其他主要基于意见更好。

离开"更好"除了回答"还有其他处理事务的方法":来自JAVA EE 6,事情发生了变化......如果你正在使用它,那么使用Hibernate作为JPA2实现(而不是作为原始的Hibernate并查看EJB3.1(或带有Interceptor的CDI)中的EntityManager和容器管理事务。