在 JPA + JAX-RS 上获取 javax.persistence.TransactionRequiredException
Getting javax.persistence.TransactionRequiredException on JPA + JAX-RS
我的 JavaEE 应用程序有问题。我是 运行 Hibernate + Jersey on TomEE。
这是我的基地class:
public abstract class BaseEntityManager<E, K>{
protected Class entityClass;
@PersistenceContext
protected EntityManager em;
public BaseEntityManager() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class) genericSuperclass.getActualTypeArguments()[0];
}
public EntityManager getManager() {
return em;
}
public void persist(E entity) { em.persist(entity); }
public void remove(E entity) { em.remove(entity); }
public E findById(K primaryKey) { return (E)em.find(entityClass, primaryKey); }
}
这是具体类型的class:
@Stateless
public class SomethingManager extends BaseEntityManager<SomethingEntity, Integer>{}
这是我的资源。我在 JSONCreator 中反序列化来自 JSON 的数据。有一些引用实体的 ID。然后在方法 "new" 中,我尝试保留工作正常的新对象,但是我无法将其他实体的关系合并回新对象(我之前提到的引用实体的 ID)。
@Path("/Something")
public class Something{
// Other entity managers here ....
@EJB
SomethingManager smm;
@EJB
OtherManager ttem;
@Secured
@POST
@Path("/new")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public SomethingEntity add(@Context HttpServletRequest req, SomethingEntity r)
{
...
try {
for (int i = 0; i < r.getOtherEntities().size(); i++) {
OtherEntity x = (r.getOtherEntities().get(i));
x = ttem.findById(x.getId());
x.getSomethingEntities().add(r);
ttem.getManager().merge(x);
}
}
catch (Exception e)
{
e.printStackTrace(); // TODO Intelligent logging
return null;
}
return r;
}
}
这会引发异常 ttem.getManager().merge(x);
似乎有什么问题?
谢谢。
调用您的 Rest 资源时没有活动事务。我可以看到 2 个解决方案:
- 如果您的服务器 Java EE 7 兼容,请将
@Transactional
拦截器绑定注释添加到 Something
class 的 add
方法。
- 用
@Stateless
注释对您的 Something
class 进行注释。然后您将拥有由容器管理的 EJB 事务。
我的 JavaEE 应用程序有问题。我是 运行 Hibernate + Jersey on TomEE。
这是我的基地class:
public abstract class BaseEntityManager<E, K>{
protected Class entityClass;
@PersistenceContext
protected EntityManager em;
public BaseEntityManager() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class) genericSuperclass.getActualTypeArguments()[0];
}
public EntityManager getManager() {
return em;
}
public void persist(E entity) { em.persist(entity); }
public void remove(E entity) { em.remove(entity); }
public E findById(K primaryKey) { return (E)em.find(entityClass, primaryKey); }
}
这是具体类型的class:
@Stateless
public class SomethingManager extends BaseEntityManager<SomethingEntity, Integer>{}
这是我的资源。我在 JSONCreator 中反序列化来自 JSON 的数据。有一些引用实体的 ID。然后在方法 "new" 中,我尝试保留工作正常的新对象,但是我无法将其他实体的关系合并回新对象(我之前提到的引用实体的 ID)。
@Path("/Something")
public class Something{
// Other entity managers here ....
@EJB
SomethingManager smm;
@EJB
OtherManager ttem;
@Secured
@POST
@Path("/new")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public SomethingEntity add(@Context HttpServletRequest req, SomethingEntity r)
{
...
try {
for (int i = 0; i < r.getOtherEntities().size(); i++) {
OtherEntity x = (r.getOtherEntities().get(i));
x = ttem.findById(x.getId());
x.getSomethingEntities().add(r);
ttem.getManager().merge(x);
}
}
catch (Exception e)
{
e.printStackTrace(); // TODO Intelligent logging
return null;
}
return r;
}
}
这会引发异常 ttem.getManager().merge(x);
似乎有什么问题?
谢谢。
调用您的 Rest 资源时没有活动事务。我可以看到 2 个解决方案:
- 如果您的服务器 Java EE 7 兼容,请将
@Transactional
拦截器绑定注释添加到Something
class 的add
方法。 - 用
@Stateless
注释对您的Something
class 进行注释。然后您将拥有由容器管理的 EJB 事务。