2016-07-23 135 views
0

我得到了多個DAO類,它擴展到一個BaseDAO,並且我在BaseDAO中打開一個新的會話,以便所有的DAO將使用同一個會話。休眠會話工廠多個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

是的,它使2個不同的會話。 您可以通過添加日誌

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

驗證它,如果你想使用1個會話所有你的DAO,使用 .getCurrentSession()代替.openSession()。此外,爲此工作,您需要更新您的休眠配置與

<property name="hibernate.current_session_context_class">thread</property> 
+0

我怎樣才能只使用1會話的所有DAO? –

+0

我的程序有一個循環,我需要提交每個循環,所以我不想使用getCurrentSession() –

+0

我不清楚你的需要。你應該添加循環和「提交每個循環」到你的問題。 – Rocherlee