Java JPA 2/Hibernate孤立删除仍然无法与@OneToMany一起使用?
我试图在Hibernate 4.3.5/JPA2对象中使用孤儿删除,但它似乎没有像我预期的那样工作。但是,我不确定我是否做了不正确的事情,或者这是否仍然是Hibernate中的一个bug 给定以下关系(@Version,为简洁起见省略了getter和setter):Java JPA 2/Hibernate孤立删除仍然无法与@OneToMany一起使用?,java,hibernate,jpa,orm,orphan,Java,Hibernate,Jpa,Orm,Orphan,我试图在Hibernate 4.3.5/JPA2对象中使用孤儿删除,但它似乎没有像我预期的那样工作。但是,我不确定我是否做了不正确的事情,或者这是否仍然是Hibernate中的一个bug 给定以下关系(@Version,为简洁起见省略了getter和setter): 老实说,我不知道为什么,但如果您将CascadeType.PERSIST(或者更好的CascadeType.ALL)添加到@OneToMany实体中的关系中,它将按预期工作 Hibernate文档可能缺少这一点细节 更新 带有JPA
老实说,我不知道为什么,但如果您将
CascadeType.PERSIST
(或者更好的CascadeType.ALL
)添加到@OneToMany
实体中的关系中,它将按预期工作
Hibernate文档可能缺少这一点细节
更新
带有JPA2的EclipseLink 2.5.1似乎没有这个问题
第二次更新
在第2.9节“实体关系”中,JPA 2.1规范规定:
如果孤立的实体是分离的、新的或删除的实体,则孤立删除的语义不适用
我不知道您的相关实体是否已分离,但如果是,则这不是一个bug:)我也正在说明这个问题。尽管它已被弃用,但下面的用法可以很好地用于孤立删除:
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
我试着用级联类型更新实体。全部,但仍然不起作用。@EricB。您是否在列表合同上设置了@OneToMany(orphaneremovation=true,cascade=CascadeType.ALL)
代码>?在这里,Hibernate4.3.5.Final和jpa-api-2.1运行良好。它从DB中删除了contract\u attachment
、attachment
和contract
实体。我做了一次彻底的清理,实际上是级联类型。所有的或级联类型。持久化似乎都能工作。但是,问题是我不想做一个级联类型。PERSIST
!孤儿删除是否应该独立于级联持续存在?@EricB。国际海事组织-它应该独立于级联,我无法想象为什么它不是。可能这是一个Hibernate bug-我现在无法检查它在不同供应商中的表现,但我会:)Hibernate在孤立删除方面存在巨大的问题。在他们的问题跟踪器上搜索这个主题会获得很多点击率。例如,hibernate 4中不存在and.CascadeType.DELETE_ORPHAN。它似乎不存在于作业中,而且org.hibernate.annotations.CascadeType.DELETE_ORPHAN不推荐使用
// loop over all contracts and delete the one with the matching id
for(Iterator<Contract> it = provider.getContracts().iterator(); it.hasNext();){
Contract c = it.next();
if( c.getId() == contractId ){
it.remove();
break;
}
}
2014-07-04 15:06:41,333 [main] [-] DEBUG org.hibernate.SQL -
/* update
com.ia.domain.Provider */ update
provider
set
default_contact_id=?,
name=?,
type=?,
version=?,
website=?
where
id=?
and version=?
Hibernate:
/* update
com.ia.domain.Provider */ update
provider
set
default_contact_id=?,
name=?,
type=?,
version=?,
website=?
where
id=?
and version=?
2014-07-04 15:06:41,334 [main] [-] TRACE hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - [null]
2014-07-04 15:06:41,334 [main] [-] TRACE hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - [name_3]
2014-07-04 15:06:41,335 [main] [-] TRACE org.hibernate.type.EnumType - Binding [CARRIER] to parameter: [3]
2014-07-04 15:06:41,336 [main] [-] TRACE hibernate.type.descriptor.sql.BasicBinder - binding parameter [4] as [INTEGER] - [2]
2014-07-04 15:06:41,336 [main] [-] TRACE hibernate.type.descriptor.sql.BasicBinder - binding parameter [5] as [VARCHAR] - [website_3]
2014-07-04 15:06:41,337 [main] [-] TRACE hibernate.type.descriptor.sql.BasicBinder - binding parameter [6] as [BIGINT] - [4]
2014-07-04 15:06:41,338 [main] [-] TRACE hibernate.type.descriptor.sql.BasicBinder - binding parameter [7] as [INTEGER] - [1]
2014-07-04 15:06:41,342 [main] [-] DEBUG org.hibernate.SQL -
/* delete one-to-many com.ia.domain.Provider.contracts */ update
contract
set
provider_id=null
where
provider_id=?
Hibernate:
/* delete one-to-many com.ia.domain.Provider.contracts */ update
contract
set
provider_id=null
where
provider_id=?
2014-07-04 15:06:41,344 [main] [-] TRACE hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - [4]
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)