JPA: Lorsque l'entité mère a obtenu retirée, entité enfant reste encore
Question
Entité client (entité mère)
@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);
}
}
Entité Facility (Entité enfant)
@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
...
}
dans l'entité de Customer
, j'utilise CascadeType.ALL
, mais lorsque je retire un client, les installations connexes sont toujours là. Supprimer customer
par
Query query = em.createNamedQuery("Customer.delete");
query.setParameter("id", customerId);
query.executeUpdate();
où
@NamedQuery(name="Customer.delete", query="delete from Customer c where c.id = :id")
La solution
en vrac supprimer les opérations ne sont pas montés en cascade, par spécification JPA:
4.10 Mise à jour et supprimer des opérations
...
Une opération de suppression applique uniquement aux entités de la classe spécifiée et ses sous-classes. Il ne cascade pas entités liées.
...
Si vous souhaitez bénéficier de cascade, charger l'entité, puis appelez EntityManager#remove(Object)
dessus.
Autres conseils
Essayez avec:
@Inject
EntityManager em;
Customer customer =...;
em.remove(customer);
toujours des opérations de cascades.