【问题标题】:What is the best practice for hibernate session and DAO休眠会话和 DAO 的最佳实践是什么
【发布时间】: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


【解决方案1】:

你不应该在你的方法中关闭会话:你没有在那里打开它。

使用第二种方法,或者这样做:

public class AccountDAOImpl implements AccountDAO {

    @Override
    public void saveAccnt(Account account) {
        Transaction transaction =null;
        Session session=HibernateSessionFactoryUtil.getSession();
        try
        {
            transaction=session.beginTransaction();
            session.save(account);

            transaction.commit();

        }
        catch(RuntimeException re)
        {
            if(transaction!=null)
                transaction.rollback();
            throw re;
        }
        finally
        {
            session.close();
        }

    }
}

【讨论】:

    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多