book_TYLEO 2008-11-05 22:52
浏览 319
已采纳

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中了。
  谢谢。

 


问题补充
各位帮帮忙吧,谢谢
  • 写回答

1条回答 默认 最新

  • catstiger 2008-11-05 23:33
    关注

    既然用EJB,就用Seam吧,它很好的解决了你的问题。Seam是最好的EJB框架了,所以俺就不献丑了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献