Hibernate会话工厂为多个DAO

时间:2016-07-23 14:25:43

标签: hibernate sessionfactory

我有多个DAO类扩展到BaseDAO,我在BaseDAO中打开一个新的Session,以便所有DAO将使用相同的会话。

@Autowired
public BaseDAOImpl(SessionFactory sessionFactory) {
    super(sessionFactory);
    this.mySession = sessionFactory.openSession();
    logger.info("My Session is Open." );
}

public Session getMySession(){
    return this.mySession;
}   

@Repository("countryDAO")
public class CountryDAOImpl extends BaseDAOImpl<Country> implements CountryDAO{

    @Autowired
    public CountryDAOImpl(SessionFactory sessionFactory) {
        super(sessionFactory);
    } 
}

@Repository("regionDAO")
public class RegionDAOImpl extends BaseDAOImpl<Region> implements RegionDAO{

    @Autowired
    public RegionDAOImpl(SessionFactory sessionFactory) {
        super(sessionFactory);
    } 
}

在我的服务类中,我自动连接2个DAO。

@Autowired
CountryDAO countryDAO;

@Autowired
RegionDAO regionDAO;

在我的控制台中,我看到我的会话打开两次。这是否意味着它开了2个新会话?我不想出于某种原因使用当前会话,因此我使用openSession()。当我执行countryDAO.getMySession()。clear()时,它只清除在countryDAO会话中加载的实体,而不是regionDAO。

1 个答案:

答案 0 :(得分:0)

是的,它会进行2次不同的会话。 您可以通过添加日志

来验证它
logger.info("My Session is Open:" + this.mySession.toString());

如果您想为所有DAOS使用1个会话,请使用 .getCurrentSession()代替.openSession()。为此,您需要使用

更新您的hibernate配置
<property name="hibernate.current_session_context_class">thread</property>