我们项目现在是在dao定义了entityManager代码如下
Service:
@Stateless @Local ({PromptPeriodService.class}) @Remote ({PromptPeriodService.class}) public class PromptPeriodServiceImpl implements PromptPeriodService { @EJB(name="PromptPeriodDAO") private static PromptPeriodDAO promptperiodDAO; @TransactionAttribute(TransactionAttributeType.REQUIRED) public void addPromptPeriodDm(PromptPeriod promptperiodNew) throws LogicException { PromptPeriod promptperiodOld = promptperiodDAO.queryPromptPeriodById(promptperiodNew.getPpdId()); if(promptperiodOld == null) { promptperiodNew.setPpdCreateDate(new Date()); promptperiodNew.setPpdUpdateDate(new Date()); promptperiodDAO.savePromptPeriod(promptperiodNew); } else { throw new LogicException(errMsg); } } }
BaseDAO:
@Stateless public class BaseDAO { @PersistenceContext(unitName="test") protected EntityManager em; }
DAO:
@Stateless @Remote (PromptPeriodDmDAO.class) @Local (PromptPeriodDmDAO.class) public class PromptPeriodDAOBean extends BaseDAO implements PromptPeriodDAO { public PromptPeriodDm queryPromptPeriodById(String promptperiodId) { PromptPeriod promptperiod = em.find(PromptPeriod.class, promptperiodId); return promptperiod; } }
现在的问题是我需要在service层做lazy load,但是发现在service的时候entityManager已经关闭了session。我的想法是把entityManager移到service中,但是这样的话有没有什么比较好的方法在transaction开始的时候把这个entityManager传递到dao呢?
我看spring代码的时候发现spring支持hibernate的时候就是在service的transactionManager的beginTransaction时候打开session放进ThreadLocal中,之后在HibernateDaoSupport中从ThreadLocal中取出session,这样的话可以做到session的打开和关闭是和transaction的开始和结束绑定的,而且dao中用的是同一个session。现在我用的是ejb3,不知道有没有方法实现这种做法呢?
我如果在service层声明entityManager,那么entityManager会和transaction的声明周期绑定,但是如何让每一个有transaction的service比较好的自动传递这个entityManager到dao呢?我有什么办法可以拦截到ejb的transaction开始和结束呢?如果可以的话,我就可以在那个开始的时候统一把那个entityManager放到threadLocal中了。
谢谢。
问题补充
各位帮帮忙吧,谢谢