3

我有一个带有 JPA 连接实体的复杂对象图。当我删除父级时,删除会正确地传递给子级。

然后我检测父类(为了不急切地加载一对一的关系)并且在删除时我得到引用完整性违规异常。查看刷新时的查询休眠问题,我可以看到休眠确实尝试以错误的顺序删除记录,因此数据库抱怨引用完整性并引发异常。

为什么这仅在实体被检测时才会出现?有没有办法改变删除级联顺序?

4

1 回答 1

1

我没有你的问题的答案,但是......你为什么要搞乱“仪器”来让你的一对一关联延迟加载?Foo我已经测试了以下内容以了解类与其之间的一对一关联FooDetail

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public FooDetail getFooDetail() {
    return detail;
}

懒加载行了。Foo这是检索实例时执行的语句:

休眠:从 Foo foo0_ 中选择 foo0_.id 作为 id45_0_,foo0_.detail_id 作为 detail3_45_0_,foo0_.shortName 作为 shortName45_0_ where foo0_.id=?

而且,稍后,当调用 getter 时,FooDetail会获取 :

休眠:选择 foodetail0_.id 作为 id46_0_,foodetail0_.fullName 作为 fullName46_0_ from FooDetail foodetail0_ where foodetail0_.id=?

并且删除给定的Foo实例也可以正常工作,语句以正确的顺序执行:

休眠:从 Foo 中删除,其中 id=?
休眠:从 FooDetail 中删除 id=?

下面,Hibernate生成的DDL供对应表参考:

创建表 Foo (id bigint not null, shortName varchar(255), detail_id bigint, 主键 (id))
创建表 FooDetail (id bigint not null, fullName varchar(255), 主键 (id))
更改表 Foo 添加约束 FK212C3F68B31178 外键 (detail_id) 引用 FooDetail

使用 Hibernate Annotations 3.4.0.GA 测试。

更新:如果这不是您要查找的内容,请使用一对多关联,一对一关联存在限制(请澄清您的问题,读者无法猜出您不知道的内容)写)。

于 2010-02-25T20:01:26.283 回答