2017-08-16 44 views
0

我遇到了JavaEE应用程序的麻烦。我在TomEE上运行Hibernate + Jersey。在JPA + JAX-RS上获取javax.persistence.TransactionRequiredException

这是我的基类:

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); } 


} 

这是具体类型的类:

@Stateless 
public class SomethingManager extends BaseEntityManager<SomethingEntity, Integer>{} 

这里是我的资源。我在我的JSONCreator中反序列化来自JSON的数据。有一些参考实体的ID。然后在方法“新”我尝试坚持新的对象工作正常,但我不能将其他实体的关系合并回新对象(前面提到的引用实体的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);

什么似乎是一个问题?

谢谢。

回答

1

调用您的Rest资源时没有活动事务。我可以看到2个解决方案:

  1. 添加@Transactional拦截器绑定注释您Something类的add方法,如果你的服务器的Java EE 7兼容。
  2. @Stateless注释标注Something类。然后您将拥有由容器管理的EJB事务。
+0

我实际上已经通过向Something添加UserTransaction @Resoruce然后将代码包装到begin()和commit()中来解决了这个问题。但我也会尝试这个解决方案。谢谢 – Schnappi