В одной совокупности ассоциаций я пытаюсь удалить все многочисленные ассоциации и вижу, что выполняется несколько операторов удаления.
// The entities
class Users{
...
public void setPhones(Set<Phone> phones){
this.phones = phones;
}
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="users", orphanRemoval=true)
public Set<Phone> getPhones(){
return this.phones;
}
...
}
class Phone{
...
@ManyToOne()
@JoinColumn(name="USER_ID")
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
...
}
//The application code...
Users u = (Users)s.get(Users.class, new Integer(220));
u.getPhones().clear();
Приведенный выше код удаляет телефоны в порядке, за исключением того, что я вижу несколько операторов удаления, отправляемых в базу данных. Я бы предпочел одно утверждение, подобное:
delete from phone where userid = 220;
Руководство по гибернации, которое описывает удаление одним выстрелом , сбивает с толку и фактически приводит к ошибке. В частности, раздел, который упоминает:
К счастью, вы можете вызвать это поведение (то есть, вторую стратегию) в любое время, отбросив (т.е. разыменовав) исходную коллекцию и вернув вновь созданную коллекцию со всеми текущими элементами.
Замена коллекции новой коллекцией приводит к исключению. И тогда есть эта строка:
Удаление одним выстрелом не применяется к коллекциям, сопоставленным inverse = "true".
Я не уверен почему. Кто-нибудь может уточнить это?
Как выполнить однократное удаление с помощью Hibernate для одной совокупности?