один снимок удаляю с гибернации по одной ассоциации - PullRequest
0 голосов
/ 21 октября 2010

В одной совокупности ассоциаций я пытаюсь удалить все многочисленные ассоциации и вижу, что выполняется несколько операторов удаления.

// 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 для одной совокупности?

1 Ответ

1 голос
/ 30 декабря 2010

Документ не сбивает с толку - он просто говорит, что это не будет работать с обратным управлением (отображается). Все, что вам нужно сделать, это удалить сторону многие-к-одному и отобразить объявление в один-ко-многим. Тогда контроль над отношениями осуществляется пользователями, и тогда произойдет одноразовое удаление.

...