【问题标题】:Hibernate Parent Child updating休眠父子更新
【发布时间】:2017-06-13 14:53:56
【问题描述】:

让我在提问之前设置场景

首先我使用的是旧版本的 Hibernate 休眠版本:3.6.10.Final

我有一个问卷/人员表,它们彼此之间存在一对一的关系。

这是我的问卷表(当然是部分),只有相关部分。

@Entity
public class Questionnaire {

...

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Person person;

...

}

这是我的 Person 表(当然是部分),只有相关部分。

@Entity
public class Person  {

...

@OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, optional = false)
@JoinColumn(name="questionnaireInfo_id", unique=true)
private QuestionnaireInfo questionnaireInfo;


....

}

如果我更新问卷对象并保存问卷实体(不使用 HQL 或任何 SQL 类型语法),它是否也会更新我的 person 表并在保存时锁定该表? [即使人的id和以前一样]

我在 x86_64-pc-linux-gnu 上使用 PostgreSQL 9.5.6,由 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11) 编译,64 位

【问题讨论】:

  • 自己测试可能会给你最可靠的答案。根据我的经验,如果您不更改对象,它不会得到更新,但没有尝试这种特殊情况。

标签: java database postgresql hibernate orm


【解决方案1】:

当您使用FetchType.LAZY 声明一对一时,它实际上并不懒惰

在这里阅读: http://justonjava.blogspot.de/2010/09/lazy-one-to-one-and-one-to-many.html

并像文章中描述的那样尝试:

对于这个问题,至少有三个众所周知的解决方案: 最简单的一种是伪造一对多的关系。这将起作用 因为集合的延迟加载比延迟加载要容易得多 单个可为空的属性,但通常这种解决方案非常 如果您使用复杂的 JPQL/HQL 查询,则不方便。

另一种是使用构建时字节码检测。有关更多详细信息,请阅读 Hibernate 文档:19.1.7。使用惰性属性获取。 请记住,在这种情况下,您必须添加 @LazyToOne(LazyToOneOption.NO_PROXY) 注解为一对一 关系让它变得懒惰。将 fetch 设置为 LAZY 是不够的。

最后一个解决方案是使用运行时字节码检测,但它会 仅适用于完全使用 Hibernate 作为 JPA 提供程序的人 JEE 环境(在这种情况下设置 "hibernate.ejb.use_class_enhancer" 为 true 应该可以解决问题:实体 Manager Configuration) 或使用 Hibernate 和 Spring 配置来做 运行时编织(这可能很难在一些较旧的 应用服务器)。在这种情况下 @LazyToOne(LazyToOneOption.NO_PROXY) 注解也是必需的。

这里进一步讨论了这个问题: Making a OneToOne-relation lazy

【讨论】:

    猜你喜欢
    • 2013-07-24
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多