【发布时间】:2015-08-04 20:02:53
【问题描述】:
实际上,我正在寻找将 session 和 DAO 用于 hibernate 4.2.x 的最佳实践
第一种方法:
public class AccountDAOImpl implements AccountDAO {
Session session=HibernateSessionFactoryUtil.getSession();
Transaction transaction =null;
@Override
public void saveAccnt(Account account) {
// TODO Auto-generated method stub
try
{
transaction=session.beginTransaction();
session.save(account);
transaction.commit();
}
catch(RuntimeException re)
{
if(transaction!=null)
transaction.rollback();
throw re;
}
finally
{
session.close();
}
}
}
或者我们采用第二种方法:
public class AccountDAOImpl implements AccountDAO {
Session session=HibernateSessionFactoryUtil.getSession();
Transaction transaction =null;
@Override
public void saveAccnt(Account account) {
// TODO Auto-generated method stub
try
{
transaction=session.beginTransaction();
session.save(account);
transaction.commit();
}
catch(RuntimeException re)
{
if(transaction!=null)
transaction.rollback();
throw re;
}
}
}
实际上每次需要执行DAO都需要在工作完成时关闭会话的close session的区别。
更新:
public class HibernateSessionFactoryUtil {
private static SessionFactory sessionFactory=null;
public static Session getSession() {
if(sessionFactory==null)
{
createSessionFactory();
}
return sessionFactory.openSession();
}
public static SessionFactory getSessionFactory() {
if(sessionFactory==null)
{
createSessionFactory();
}
return sessionFactory;
}
private static void createSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure("/hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
}
【问题讨论】:
-
也不应该,DAO 不应该负责打开和关闭交易。这是服务层的工作。
标签: java hibernate session dao