2017-06-13 114 views
0

让我设置提出的问题休眠亲子更新

首先我使用的是旧版本的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作为全面爆发 JEE环境JPA提供商(在这种情况下设置 “hibernate.ejb.use_class_enhancer”真 工作应诀窍:实体 管理器配置)或使用Hibernate with Spring配置为执行 运行时编织(这可能很难在某些较早的 应用程序服务器上实现)。在这种情况下, @LazyToOne(LazyToOneOption.NO_PROXY)注释也是必需的。

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