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")
Foi útil?

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