我有一个带有JPA连接实体的复杂对象图。当我删除父级时,删除正确地级联到子级。
然后我检测父类(因为没有急切地加载一对一的关系)并且在删除时我得到参照完整性违规异常。看看在刷新时查询hibernate的问题,我可以看到hibernate确实试图以错误的顺序删除记录,因此db会引发参照完整性并抛出异常。
为什么只有在实体进行检测时才能显示?有没有办法改变删除级联顺序?
答案 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进行测试。
更新:如果这不是您想要的,那么使用一对多关联,一对一关联存在限制(请澄清您的问题,读者无法猜出你不写的东西。)