在JPA + JAX-RS

时间:2017-08-16 02:50:04

标签: hibernate exception transactions jersey tomee

我的JavaEE应用程序遇到了麻烦。我在TomEE上运行Hibernate + Jersey。

这是我的基类:

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 个答案:

答案 0 :(得分:1)

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

  1. 如果您的服务器符合Java EE 7,则将@Transactional拦截器绑定注释添加到add类的Something方法。
  2. 使用Something注释为您的@Stateless课程添加注释。然后,您将拥有由容器管理的EJB事务。