java - 在 JAX-RS 序列化期间保留 EntityManager session

标签 java jpa jax-rs cdi

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

不。尝试转换时,我收到 LazyInitializationException。我显然丢失了 EntityManager session 。

我有一个解决方法,可以从 JAX-RS 资源而不是 DAO 上输入事务,以保留相同的 EntityManager,但这给我留下了不好的印象。

使用 CDI、JPA 和 JAX-RS,一旦我离开 DAO 启动的事务,我将如何保留 EntityManager 的 session ?

最佳答案

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

由于您的 fetchType 是惰性的,您的 DAO 仅提供部分数据以及可以从数据库中获取更多数据的信息。如果没有 Activity session ,则获取数据失败。

你有两个选择:

  1. 当您尝试从 JAX-RS 资源输入交易时,但这会使您的 DAO 变得荒谬。在本例中,我只需删除 DAO 并将 EntityManager 注入(inject) JAX-RS 资源中。
  2. 按预期使用 DAO 并初始化消费者期望的所有数据。这可以通过 Hibernate.initialize(entity) 来完成或一些辅助方法,它迭代丢失的实体并简单地对每个实体调用 entity.getId()

关于java - 在 JAX-RS 序列化期间保留 EntityManager session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26511379/

相关文章:

java - Android IDE 不创建 Main.java 或 XML

spring - 带有 Spring、Spring MVC、Hibernate、JPA 的项目的 Maven 3 原型(prototype)

spring - 不允许在共享 EntityManager 上创建事务 - 使用 Spring 事务或 EJB CMT

java - 使用 Apache-cxf/jax-rs 将对象传递给休息服务有什么好的来源吗?寻求帮助

java - 如何锁定JFrame?

java - 如何使用 lambda 表达式创建 'getter'

mysql - 如何使用EntityManager为MySql JSON_EXTRACT函数创建JPQL查询

cors - 如何在 JAX-RS Web 服务上启用跨域请求?

java - JAX-RS 中的 JSON 到 java 解码在 POST 中返回 { }

java - 如何从 jsp Spring MVC 访问 ModelMap 对象中包含的映射键/值对