JPA: When parent entity got removed, child entity still remain
Question
Customer Entity (Parent Entity)
@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);
}
}
Facility Entity (Child Entity)
@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
...
}
in Customer
entity, I use CascadeType.ALL
, however when I remove a customer, the associated facilities are still there. I delete customer
by
Query query = em.createNamedQuery("Customer.delete");
query.setParameter("id", customerId);
query.executeUpdate();
where
@NamedQuery(name="Customer.delete", query="delete from Customer c where c.id = :id")
Solution
Bulk delete operations are not cascaded, per JPA specification:
4.10 Bulk Update and Delete Operations
...
A delete operation only applies to entities of the specified class and its subclasses. It does not cascade to related entities.
...
If you want to benefit from cascading, load the entity and then call EntityManager#remove(Object)
on it.
OTHER TIPS
Try with:
@Inject
EntityManager em;
Customer customer =...;
em.remove(customer);
This always cascades operations.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow