EJB和Jersey之间的实体状态

时间:2012-04-02 05:53:34

标签: jpa ejb

我是新手。

Jersey和EJB是否拥有相同的EntityManager范围?

我是否必须将EntityManager传递给EJB以获得相同的持久性上下文?

主要目标用途是JTA。

@Stateless
class MyEJB {

    public MyEntity find(Long id) {
        ...
    }

    @PersistenceContext;
    EntityManager entityManager;
}


class MyResource {

    @GET
    @Path("/myentity/{id}");
    public MyEntity get(@PathParam("id") final long id) {
        final MyEntity found = myEjb.find(id);
        // is found's state detached?

        // should I have to reattach?
        found.setDate(new Date());

        return found;
    }

    @EJB
    private MyEjb myEjb;

    @PersistenceContext;
    EntityManager entityManager;
}

1 个答案:

答案 0 :(得分:1)

  

Jersey和EJB是否拥有相同的EntityManager范围?

     

我是否必须将EntityManager传递给EJB以获得相同的持久性上下文?

我不认为你的措辞是正确的,但他们可以共享相同的EntityManager实例,并且你选择了正确的方法(通过注入)。查看Java EE 6教程的this chapter

  

要获取EntityManager实例,请将实体管理器注入应用程序组件:

@PersistenceContext
EntityManager em;

所以,再一次,你的方法是正确的。关于代码注释中的问题:MyEntity是附加还是分离的事实,它取决于EJB中find方法的实现。如果您执行以下操作,将附上:

public MyEntity find(Long id) {  
    return entityManager.find(MyEntity.class, id);  
}  

最后,通过这种方式,如果您选择JTA来使用容器管理的事务,那么事务将自动与MyBean方法的自然边界绑定。要获得JTA事务,您必须在persistence.xml文件中使用此行:

 <persistence-unit name="em" transaction-type="JTA">