JPA: Wenn übergeordnete Entität entfernt wurde, noch Kind Einheit bleiben
Frage
Kunden 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);
}
}
Diese Struktur 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
Einheit, ich CascadeType.ALL
, aber wenn ich einen Kunden entfernen, die damit verbundenen Einrichtungen sind immer noch da. Ich lösche customer
von
Query query = em.createNamedQuery("Customer.delete");
query.setParameter("id", customerId);
query.executeUpdate();
Dabei steht
@NamedQuery(name="Customer.delete", query="delete from Customer c where c.id = :id")
Lösung
Bulk-Löschvorgänge nicht kaskadiert werden, pro JPA-Spezifikation:
4.10 Bulk-Update und Delete-Operationen
...
Ein Löschvorgang gilt nur für Einheiten der angegebenen Klasse und ihre Unterklassen. Dabei spielt es keine Kaskade verbundene Unternehmen.
...
Wenn Sie profitieren von Cascading wollen, das Unternehmen laden und dann EntityManager#remove(Object)
auf es nennen.
Andere Tipps
Versuchen Sie, mit:
@Inject
EntityManager em;
Customer customer =...;
em.remove(customer);
Dies ist immer Kaskaden-Operationen.