Java JPA 2/Hibernate孤立删除仍然无法与@OneToMany一起使用?

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

我试图在Hibernate 4.3.5/JPA2对象中使用孤儿删除,但它似乎没有像我预期的那样工作。但是,我不确定我是否做了不正确的事情,或者这是否仍然是Hibernate中的一个bug

给定以下关系(@Version,为简洁起见省略了getter和setter):


老实说,我不知道为什么,但如果您将
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)