我是新手。
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;
}
答案 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">