在onetomany协会上用hibernate删除一次

时间:2010-10-21 02:24:05

标签: hibernate one-to-many

在onetomany关联中,我试图删除所有多个关联,并看到正在执行多个删除语句。

// The entities
class Users{
...
    public void setPhones(Set<Phone> phones){
        this.phones = phones;
    }

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="users", orphanRemoval=true)
    public Set<Phone> getPhones(){
        return this.phones;
    }
...
}
class Phone{
...
       @ManyToOne()
       @JoinColumn(name="USER_ID")
       public Users getUsers() {
           return users;
       }

       public void setUsers(Users users) {
           this.users = users;
       }
...
}
//The application code...
Users u = (Users)s.get(Users.class, new Integer(220));
u.getPhones().clear();

上面的代码删除了手机,除了我看到多个删除语句被发送到数据库。我宁愿选择类似于:

的单一陈述
delete from phone where userid = 220;

描述one-shot delete的hibernate手册令人困惑,实际上会导致错误。特别是提到的部分:

  

幸运的是,您可以随时通过丢弃(即解除引用)原始集合并返回包含所有当前元素的新实例化集合来强制执行此行为(即第二个策略)。

使用新集合替换集合会导致异常。然后是这一行:

  

单次删除不适用于映射inverse =“true”的集合。

我不确定为什么。有人可以详细说明一下吗? 如何在onetomany关联上使用Hibernate执行一次性删除?

1 个答案:

答案 0 :(得分:1)

该文档并不令人困惑 - 它只是说这不适用于反向控制(映射)。您需要做的就是在一对多中删除多对一侧和映射声明。然后用户完成对关系的控制,然后进行单删除。