ltsiphon 2008-07-22 16:42
浏览 1234
已采纳

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

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

以下贴出代码部分,望大家能够指点.
[code]
public class Account implements java.io.Serializable
{
private String id;
private String name;
private String enabled;
private Set acct2groups = new HashSet(0);

@OneToMany(cascade = CascadeType.ALL, mappedBy = "account")
public Set getAcct2groups()
{
return this.acct2groups;
}
[code]
将Account类查出后,
[code]
Account account = dao.findById(1);
Set set = account.getAcct2groups();//此时set结果集为4
set.clear();
em.merge(account);
[code]
事务是spring控管的,做别的持久层动作都没问题.
就是不能将remove掉的4个Acct2group对象,重DB中删除.
将set.clear换成set.iterator().hasNext()迭代remove也不可以.

大家伙帮忙看看啊.

[b]问题补充:[/b]
kamhung 你好,
我用的是hibernate,org.hibernate.annotations.CascadeType没有DELETE_OPTION这个属性啊.只有DELETE和DELETE_ORPHAN.我两个都试了一下,都没有达到删除孤子的效果啊,还望再次帮助.

  • 写回答

4条回答 默认 最新

  • iteye_7762 2008-07-23 13:23
    关注

    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节点下加入:

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信