2017-08-16 1 views
0

Je rencontre des problèmes avec mon application JavaEE. Je cours Hibernate + Jersey sur TomEE.Obtenir javax.persistence.TransactionRequiredException sur JPA + JAX-RS

Voici ma classe de base:

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


} 

C'est la classe pour le type de béton:

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

Et voici ma ressource. Je désérialise les données de JSON dans mon JSONCreator. Il y a des identifiants d'entités référencées. Ensuite, dans la méthode "new" j'essaie de persister nouvel objet qui fonctionne bien, mais je ne peux pas fusionner la relation des autres entités vers le nouvel objet (les ID des entités référencées que j'ai mentionné plus tôt).

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

Ceci déclenche l'exception ttem.getManager(). Merge (x);

Ce qui semble être un problème?

Merci.

Répondre

1

Il n'y a pas de transaction active lorsque vous appelez votre ressource de repos. Je peux voir 2 solutions:

  1. Ajouter l'annotation de liaison @Transactional intercepteurs à votre méthode add de classe Something si votre serveur est compatible Java EE 7.
  2. Annotez votre classe Something avec l'annotation @Stateless. Vous aurez alors une transaction EJB gérée par conteneur.
+0

J'ai effectivement résolu le problème en ajoutant UserTransaction @Resoruce à Quelque chose et en enveloppant mon code dans begin() et commit(). Mais je vais essayer cette solution aussi. Je vous remercie – Schnappi