【问题标题】:Persisting JPA using @Transactional not working使用 @Transactional 持久化 JPA 不起作用
【发布时间】:2016-07-16 16:03:40
【问题描述】:

我使用 Jersey 作为 WebService 和 Hibernate EntityManager 来保存我的数据...

如果我这样写我的方法,持久性将正常工作:

@GET
@Path("/")
public Response test() {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
    EntityManager em = emf.createEntityManager();

    Test product = new Test("desc");

    em.getTransaction().begin();
    if (!em.contains(product)) {
        em.persist(product);
        em.flush();
    }
    em.getTransaction().commit();

    em.close();
    emf.close();

    return Response.status(Response.Status.OK).build();
}

但是我想使用 com.google.inject.persist.Transactional 中的@Transactional 来使代码更简洁:

@GET
@Transactional
@Path("/")
public Response test() {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
    EntityManager em = emf.createEntityManager();

    Test product = new Test("desc");
        em.persist(product);

    em.close();
    emf.close();

    return Response.status(Response.Status.OK).build();
}

但是使用此代码,数据不会记录到数据库中!

任何想法

【问题讨论】:

  • 你定义TransactionalManager了吗?
  • 不,因为我没有使用 Spring .. 我想改用 Guice

标签: hibernate jpa jersey transactional


【解决方案1】:

在你缺少的代码中

em.flush();

另外两个建议:

1) 让 Guice 管理实体管理器。注入,不要自己创建EntityManager实例。

public class ProductDao {

  @Inject
  private EntityManager em;

  public Product find(Long id) {
      return em.find(Product.class, id);
  }

  @Transactional
  public void save(Product entity) {
      em.persist(entity);
  }

}

注意:我不熟悉 Guice,但我知道 Spring。

2) 使用分层设计。将应用程序代码分成控制器、域、服务和持久层。

持久层用于访问数据。将所有使用 EntityManager 方法的类移动到持久性(数据访问)层。

服务层用于控制事务。

域层用于实体和特定于实体的业务逻辑。

控制器层用于请求映射和编组。在这里使用请求映射注解@Get、@Path("/")。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2020-06-05
    • 2018-01-02
    • 2013-01-02
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多