让我在提出问题之前设置方案
首先,我使用旧版本的Hibernate Hibernate版本:3.6.10.Final
我有一个问卷/人员表,彼此之间有一对一的关系。
这是我的问卷调查表(当然是部分),只是相关部分。
@Entity
public class Questionnaire {
...
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private 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类型语法),它是否也会更新我的人员表并在保存时锁定该表? [即使人的身份仍与以前相同]
我在x86_64-pc-linux-gnu上使用PostgreSQL 9.5.6,由gcc(GCC)4.8.5 20150623(Red Hat 4.8.5-11)编译,64位
答案 0 :(得分:0)
当您使用FetchType.LAZY
在这里阅读: http://justonjava.blogspot.de/2010/09/lazy-one-to-one-and-one-to-many.html
并在描述的文章中尝试:
这个问题至少有三个众所周知的解决方案: 最简单的就是伪造一对多的关系。这会奏效 因为延迟加载的集合比延迟加载要容易得多 单一可空属性但通常这种解决方案非常有用 如果您使用复杂的JPQL / HQL查询,则不方便。
另一个是使用构建时字节码检测。有关更多详细信息,请阅读Hibernate文档:19.1.7。使用lazy属性获取。 请记住,在这种情况下,您必须添加 @LazyToOne(LazyToOneOption.NO_PROXY)注释一对一 关系让它变得懒惰。将提取设置为LAZY是不够的。
最后一个解决方案是使用运行时字节码检测,但它会 仅适用于那些使用Hibernate作为JPA提供商的人 JEE环境(在这种情况下设置 " hibernate.ejb.use_class_enhancer"真的应该做的伎俩:实体 管理器配置)或使用配置了Spring的Hibernate来做 运行时编织(这可能很难在一些旧版本上实现 应用服务器)。在这种情况下 @LazyToOne(LazyToOneOption.NO_PROXY)注释也是必需的。
这里进一步讨论了这个问题: Making a OneToOne-relation lazy