0 0

JPA 一对多级联更新时,不能级联删除.30

级联新增,删除都ok;
级联更新时,修改从表内容的update,新增也ok,就是删除不ok.

以下贴出代码部分,望大家能够指点.

public class Account implements java.io.Serializable
{
    private String id;
    private String name;
    private String enabled;
    private Set<Acct2group> acct2groups = new HashSet<Acct2group>(0);

@OneToMany(cascade = CascadeType.ALL, mappedBy = "account")
    public Set<Acct2group> getAcct2groups()
    {
        return this.acct2groups;
    }

将Account类查出后,

Account account = dao.findById(1);
Set set = account.getAcct2groups();//此时set结果集为4
set.clear();
em.merge(account);

事务是spring控管的,做别的持久层动作都没问题.
就是不能将remove掉的4个Acct2group对象,重DB中删除.
将set.clear换成set.iterator().hasNext()迭代remove也不可以.

大家伙帮忙看看啊.

问题补充:
kamhung 你好,
我用的是hibernate,org.hibernate.annotations.CascadeType没有DELETE_OPTION这个属性啊.只有DELETE和DELETE_ORPHAN.我两个都试了一下,都没有达到删除孤子的效果啊,还望再次帮助.
DAO 
2008年7月22日 16:42

4个答案 按时间排序 按投票排序

0 0

采纳的答案

JPA规范是不支持级联删除, 不过一般实现方都会提供扩展功能来支持。
如果你用的是toplink实现包的话, 你就要实现一个DescriptorCustomizer 接口

public class AccountDescriptorCustomizer implements DescriptorCustomizer {

    public void customize(ClassDescriptor descriptor) throws Exception {
        OneToManyMapping mapping = (OneToManyMapping) descriptor.getMappingForAttributeName("acct2groups");
        if (mapping != null) mapping.setIsPrivateOwned(true);
    }
}
然后在persistence.xml 中properties节点下加入:
<property name="toplink.descriptor.customizer.包名.Account" value="包名.AccountDescriptorCustomizer"/>

最后Acct2group 中 @ManyToOne 属性cascade将CascadeType.ALL 改成 {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.MERGE}.

如果是hibernate的实现的话, 在@OneToMany
旁边加上: @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_OPTION)

2008年7月23日 13:23
0 0

可以这么做,

account.setAcct2grooups(null);
em.merge(account);

2008年7月23日 11:05
0 0

可以这么做,

account.setAcct2grooups(null);
em.merge(account);

2008年7月23日 11:04
0 0

你描述的这种需求不属于级联删除,属于hibernate中的级联删除孤子,在jpa里面没有。
只能手动删除

2008年7月22日 21:05

相关推荐

Global site tag (gtag.js) - Google Analytics