Gangmax Blog

如何在JPA 1.0下实现OneToMany的delete-orphan cascade策略

Migarated from here at ‘2012-06-04 17:16:25’.

在JPA 1.0中,cascade的类型包含:MERGE, REFRESH, PERSIST, REMOVE, ALL

用过Hibernate的同学们都知道,以上类型和Hibernate的cascade相比,少了delete-orphan这种类型。而delete- orphan是很有用的,不知道为什么JPA 1.0并不支持。听说JPA 2.0将要加入,呵呵……总之,这再次证明了JPA 1.0的功能只是Hibernate功能的一个不完整的子集。

既然我们的项目选择了使用JPA 1.0,那么我们就需要找出在JPA 1.0下实现delete-orphan的方法。好在我们使用JPA的Hibernate实现(相信这也是大部分JPA使用者的使用方式),所以就有了以下的解决方法,也就是在Entity中加入Hibernate的Annotation: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
...
@Entity
@Table(name = "ORDERS")
public class Order implements Auditable, Serializable
{
...
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<OrderItem> orderItems;
...
}

注意@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)这句。经测试后确认,加入这句后,JPA底层的Hibernate就会完成delete-orphan的动作,没有这句则不行。Hibernate确实够强大,发现JPA 的annotation不管用,如果发现自己的annotation,还是会自己搞定,牛……

灵感从这里来。

Comments