JPA:当父实体被删除时,子实体仍然存在

时间:2010-08-04 20:43:53

标签: jpa java-ee orm jpql

客户实体(父实体)

@Entity
public class Customer {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String name;

@OneToMany(mappedBy="customer", cascade=CascadeType.ALL)
private List<Facility> facilities;

//Setter and Getter for name and facilities

public void addFacility(Facility facility){
    if(this.facilities == null){
        this.facilities = new ArrayList<Facility>();
    }
    this.facilities.add(facility);
    facility.setCustomer(this);
}
}

设施实体(儿童实体)

@Entity
public class Facility {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToOne
@JoinColumn(name="CUSTOMER_FK")
private Customer customer;

private String name;

//Setter and Getter, equals and hashcode
...
}

Customer实体中,我使用CascadeType.ALL,但是当我删除客户时,相关设施仍在那里。我按

删除了customer
Query query = em.createNamedQuery("Customer.delete");
query.setParameter("id", customerId);
query.executeUpdate();

,其中

@NamedQuery(name="Customer.delete", query="delete from Customer c where c.id = :id")

2 个答案:

答案 0 :(得分:2)

根据JPA规范,批量删除操作不是级联的:

  

4.10批量更新和删除操作

     

...

     

删除操作仅适用于   指定类的实体和   它的子类。它没有级联到   相关实体。

     

...

如果您想从级联中受益,请加载实体,然后在其上调用EntityManager#remove(Object)

答案 1 :(得分:0)

尝试:

@Inject
EntityManager em;

Customer customer =...;
em.remove(customer);

这总是级联操作。