我有多个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。
答案 0 :(得分:0)
是的,它会进行2次不同的会话。 您可以通过添加日志
来验证它logger.info("My Session is Open:" + this.mySession.toString());
如果您想为所有DAOS使用1个会话,请使用
.getCurrentSession()
代替.openSession()
。为此,您需要使用
<property name="hibernate.current_session_context_class">thread</property>