【问题标题】:JPA LazyInitializationException when returning a JAXB Object through a Webservice通过 Web 服务返回 JAXB 对象时出现 JPA LazyInitializationException
【发布时间】:2011-08-24 19:17:13
【问题描述】:

我正在与 JBoss 合作。我创建了一个简单的 JAX-RS Web 服务,它从数据库中检索 JPA 实体并将其返回给用户。一旦我与另一个实体建立关系(@OneToOne),我就会得到一个 LazyInitializationException。原因很简单:JPA(延迟加载)没有初始化关系,当 jaxb 尝试序列化它时,一切都中断了。

但是我该如何解决呢?

我可以在归还对象之前触及关系。对于更大的对象网络来说既不好也不复杂。

我可以扩展我的 Persistence 上下文,因此我的会话在 jaxb 序列化期间仍然处于活动状态。好主意,但怎么做?

是否有标准的最佳实践方法来解决我的问题。

劳尔斯

【问题讨论】:

    标签: jpa jboss jaxb jax-rs jboss6.x


    【解决方案1】:

    您可以更改关系注释以急切地获取对象。

    @OneToOne(fetch=FetchType.EAGER)
    

    【讨论】:

      【解决方案2】:

      在处理 JPA 实体时,您需要确保注释属性(访问器)而不是字段(实例变量)。

      以下是使用 JAX-RS、JAXB 和 JPA 创建 JAX-RS 服务的示例:

      【讨论】:

      • 我们从hibernate切换到eclipselink,现在它可以工作了。谢谢。
      【解决方案3】:

      你必须使用@XmlTransient注解来防止关系被序列化。

      【讨论】:

      • 但是我想序列化关系。但是当 jaxb 尝试时,我得到了一个异常。
      • 你不应该序列化延迟加载关系。反序列化后你应该如何使用它?
      • 我不明白这个问题。该关系应该在其序列化之前加载,以便将其完全序列化到 xml 中。至少这就是我想要的。
      • 好的,我知道了。但是在这种情况下,您必须自己解决所有惰性关系。否则没人知道你想解决多深。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多