Hibernate Parent Child更新

时间:2017-06-13 14:53:56

标签: java database postgresql hibernate orm

让我在提出问题之前设置方案

首先,我使用旧版本的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位

1 个答案:

答案 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