2017-08-16 144 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

相關問題