JPA: Quando a entidade pai foi removida, a entidade infantil ainda permanece
Pergunta
Entidade do cliente (entidade pai)
@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);
}
}
Entidade da instalação (entidade infantil)
@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
...
}
dentro Customer
entidade, eu uso CascadeType.ALL
, no entanto, quando removo um cliente, as instalações associadas ainda estão lá. eu apago customer
por
Query query = em.createNamedQuery("Customer.delete");
query.setParameter("id", customerId);
query.executeUpdate();
Onde
@NamedQuery(name="Customer.delete", query="delete from Customer c where c.id = :id")
Solução
As operações de exclusão em massa não estão em cascata, de acordo com a especificação JPA:
4.10 Atualização em massa e excluir operações
...
Uma operação de exclusão se aplica apenas às entidades da classe especificada e suas subclasses. Não cascata em entidades relacionadas.
...
Se você deseja se beneficiar da cascata, carregue a entidade e depois ligue EntityManager#remove(Object)
nele.
Outras dicas
Tente com:
@Inject
EntityManager em;
Customer customer =...;
em.remove(customer);
Isso sempre cascata as operações.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow