jpa中orphanRemoval=true如何理解

zrz55661 发布于 2014/06/04 10:57
阅读 13K+
收藏 1
JPA

最近在使用jpa进行开发,发现其中包含三种删除:

1. Explicit Remove  明确的删除

2. Cascading Remove   级联删除

3.Orphan Removal  ???  这个删除就不是很明白了?  请大家帮我理解一下

加载中
0
不允许改性别
不允许改性别

按照官方给出的字面意思是:如果删除关系,是否删除关系上的实体,true表示会删除,false表示不删除。我们来举个例子说明一下,现在分别有User和Address两个实体,User类上有一个addresses的字段,表示引用多个Address实例,User和Address是一对多关系。大致的代码如下:

public class User{
    @OneToMany(orphanRemoval = true)
    private Set<Address> addresses;
//...
}

public class Address{
//...
}

我们操作User实体,并删除一个address实例。 

User user = em.find(User.class,1L);
Address address = em.find(Address.class,1L);
user.getAddresses().remove(address);
em.save(user);

如果orphanRemoval = true,那么这个操作会删除address对象,如果为false,则会删除他们的关系,将address对user的引用设置为null。

 

不过我自己做过相应的测试,发现无论如何设置,它并不会生效。

0
s
super超大

借用楼上的关系测试一下,首先用单向一对多关系测试。没有设置 CascadeType.all  或者 remove,否则只会更新关联字段为null。

//单向一对多,user里有addresses
public class User{
    //@OneToMany(orphanRemoval = true)//此时移除user里的某一个address会级联更新该userId字段为null
    //@OneToMany(orphanRemoval = false)//此时移除user里的某一个address会级联更新该userId字段为null
    //@OneToMany(cascade=CascadeType.ALL,orphanRemoval = true)//此时移除user里的某一个address会级联删除该address
    //@OneToMany(cascade=CascadeType.ALL,orphanRemoval = false)//此时移除user里的某一个address会级联更新该userId字段为null
    @JoinColumn(name="userId")
    private Set<Address> addresses;
//...
}

//address里没有user
public class Address{
//...
}

再来测试双向一对多的关系。

//双向一对多的一端,user里有addresses
public class User{
    //@OneToMany(orphanRemoval = true,mappedBy="user",)//此时移除user里的某一个address无任何效果
    //@OneToMany(orphanRemoval = false,mappedBy="user",)//此时移除user里的某一个address无任何效果
    //@OneToMany(cascade=CascadeType.ALL,orphanRemoval = true,mappedBy="user",)//此时移除user里的某一个address会级联删除该address
    //@OneToMany(cascade=CascadeType.ALL,orphanRemoval = false,mappedBy="user",)//此时移除user里的某一个address无任何效果  
    //注解mappedBy表示自己不维护关系,由Address来维护关系
    private Set<Address> addresses;
//...
}

//双向一对多的多端,address里有user
public class Address{

    @ManyToOne
    @JoinColumn(name="userId")
    private User user;
//...
}

在双向关联关系里,让一端维护关系所以设置失效了???但是设置cascade=CascadeType.ALL,orphanRemoval=true之后又可以删除。这点还得研究一下

返回顶部
顶部