在JAX-RS序列化期间保留EntityManager会话

时间:2014-10-22 15:35:50

标签: java jpa jax-rs cdi

我有一个简单的JAX-RS资源,用于序列化JPA实体的视图。 JAX-RS资源从DAO获取实体,将其传递给bean映射器,然后序列化结果。您认为这很容易实现。

不。在尝试转换时,我得到一个LazyInitializationException。我显然已经失去了EntityManager会话。

我有一个解决方法,我将从JAX-RS资源而不是在DAO上输入一个事务,以保留相同的EntityManager,但这会让我的口味不好。

使用CDI,JPA和JAX-RS,在DAO启动事务后,如何保留我的EntityManager会话?

2 个答案:

答案 0 :(得分:1)

DAO的目标是封装和抽象对数据层的访问。所以DAO应该提供消费者所需的数据。

由于你的fetchType是懒惰的,你的DAO只提供一部分数据,其中包含可以从数据库中获取更多数据的信息。在没有活动会话的情况下获取数据失败。

您有两种选择:

  1. 当您尝试从JAX-RS资源输入事务时,这会将您的DAO降低到荒谬。在这种情况下,我只需删除DAO并将EntityManager注入JAX-RS资源。
  2. 按照预期使用您的DAO并初始化消费者期望的所有数据。这可以使用Hibernate.initialize(entity)或一些辅助方法来完成,这些方法遍历缺失的实体,只需在每个实体上调用entity.getId()

答案 1 :(得分:0)

我的观点是你的DAO应该返回一个已初始化所有必需关系的实体。 JAX-RS资源的作用应该只是序列化你给它的任何东西,它不应该担心懒惰的关系。