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")
Was it helpful?

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
scroll top