JPA: Когда родительский объект был удален, дочерний объект все еще остается - PullRequest
2 голосов
/ 05 августа 2010

Клиентский объект (родительский объект)

@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 (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
...
}

в 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")

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Операции массового удаления не каскадируются, согласно спецификации JPA:

4.10 Операции массового обновления и удаления

...

Операция удаления применяется только к сущности указанного класса и его подклассы. Это не каскад связанные лица.

...

Если вы хотите извлечь выгоду из каскадирования, загрузите объект, а затем вызовите EntityManager#remove(Object) для него.

0 голосов
/ 29 октября 2012

Попробуйте с помощью:

@Inject<br> EntityManager em;<br></p> <p>Customer customer =...;<br> em.remove(customer);

Это всегда каскадные операции.

...