EntityManager在service层和dao层之间的传递

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值