2017-08-16 8 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がいくつかあります。次にメソッド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)をスローします。

問題があるようですか?

ありがとうございます。

答えて

1

Restリソースを呼び出すときにアクティブなトランザクションはありません。サーバーは、Java EE 7に準拠している場合

  1. Somethingクラスのごadd方法に@Transactionalインターセプタバインディング注釈を追加します。私は2つのソリューションを見ることができます。
  2. @Stateless注釈でSomethingクラスに注釈を付けます。次に、コンテナによって管理されるEJBトランザクションを作成します。
+0

私は実際に、UserTransaction @ ResuuceをSomethingに追加して、コードをbegin()とcommit()にラップすることで、この問題を解決しました。しかし、私はこの解決策も試みるでしょう。ありがとうございました – Schnappi

関連する問題