Hibernate,检测和删除级联顺序

时间:2010-02-25 10:36:18

标签: hibernate orm jpa cascade instrumentation

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

然后我检测父类(因为没有急切地加载一对一的关系)并且在删除时我得到参照完整性违规异常。看看在刷新时查询hibernate的问题,我可以看到hibernate确实试图以错误的顺序删除记录,因此db会引发参照完整性并抛出异常。

为什么只有在实体进行检测时才能显示?有没有办法改变删除级联顺序?

1 个答案:

答案 0 :(得分:1)

我对你的问题没有答案,但是......你为什么要搞乱“仪器”来使你的一对一关联懒惰?我已经测试了以下内容,以便在课程Foo与其FooDetail之间实现一对一关联:

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

延迟加载正常工作。这是检索Foo实例时执行的语句:

Hibernate: select foo0_.id as id45_0_, foo0_.detail_id as detail3_45_0_, foo0_.shortName as shortName45_0_ from Foo foo0_ where foo0_.id=?

之后,在调用getter时,会获取FooDetail

Hibernate: select foodetail0_.id as id46_0_, foodetail0_.fullName as fullName46_0_ from FooDetail foodetail0_ where foodetail0_.id=?

删除给定的Foo个实例工作很好,语句按正确的顺序执行:

Hibernate: delete from Foo where id=?
Hibernate: delete from FooDetail where id=?

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

create table Foo (id bigint not null, shortName varchar(255), detail_id bigint, primary key (id))
create table FooDetail (id bigint not null, fullName varchar(255), primary key (id))
alter table Foo add constraint FK212C3F68B31178 foreign key (detail_id) references FooDetail

使用Hibernate Annotations 3.4.0.GA进行测试。

更新:如果这不是您想要的,那么使用一对多关联,一对一关联存在限制(请澄清您的问题,读者无法猜出你不写的东西。)