我得到了多个扩展到BaseDAO的DAO类,我在BaseDAO中打开一个新会话,以便所有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 会话中加载的实体,而不是区域 DAO。
是的,它有 2 个不同的会话。您可以通过添加日志来验证它
logger.info("My Session is Open:" + this.mySession.toString());
如果您想对所有 DAOS 使用 1 个会话,请使用 .getCurrentSession()
而不是.openSession()
.同样要使其正常工作,您需要更新休眠配置
<property name="hibernate.current_session_context_class">thread</property>