休眠会话工厂一个新会话用于多个 DAO



我得到了多个扩展到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>

最新更新