JPA: когда родительское сущность удалена, детская сущность все еще остается
Вопрос
Предприятие клиентов (родительское предприятие)
@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")
Решение
Операции SULK DELETE не Cascaded, Per JPA Спецификация:
4.10 Обновление Обновления и удаление
...
Удаление операции относится только к объектам указанного класса и его подклассов. Это не каскадно для связанных объектов.
...
Если вы хотите извлечь выгоду из каскада, загрузите сущность, а затем позвоните EntityManager#remove(Object)
в теме.
Другие советы
Попробуй с:
@Inject
EntityManager em;
Customer customer =...;
em.remove(customer);
Это всегда каскады операций.
Не связан с StackOverflow