我们项目现在是在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中了。
谢谢。