2013-08-15 2 views
3

У меня есть объект, называемый "Дом", который содержит несколько "Room" с, что установка следующим образом:Hibernate: коллекция удалить ребенка

House.java:

@Entity 
public class House { 
    @OneToMany(mappedBy = "house", cascade = CascadeType.ALL, orphanRemoval = true) 
    private List<Item> rooms; 
    ... 
} 

Room.java:

@Entity 
public class Room { 
    @ManyToOne 
    @JoinColumn(name = "houseId") 
    private House house; 
    ... 
} 

Теперь, если я удалю комнату непосредственно через менеджера объекта он не удаляется:

getEntityManager().contains(room); // returns true 
getEntityManager().remove(room); 
getEntityManager().flush(); 

Если я удалить его из коллекции, он удаляется:

house.getRooms().remove(room); 
getEntityManager().persist(); 
getEntityManager().flush(); 

Может кто-нибудь объяснить мне такое поведение? Спасибо!

+0

Спасибо за 'flush()' !!! –

ответ

1

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

В первом коде вы удаляете объект из EntityManager persistence context (и администратор объекта регистрирует удаление) и flush() применяет эту операцию, удаляя комнату из базы данных.

Во втором примере вы вызываете List.remove(): вы не совет EntityManager для удаления объекта из базы данных; orphanRemoval будет работать, когда вы вызываете entityManager().persist(house), потому что когда вы делаете house.getRooms().remove(room), вы изменяете дом и должны сообщать entityManager применить эту модификацию с помощью EntityManager.persist(); orphanRemoval сделать остальное удаление удаленной комнаты, поскольку обнаружено как сирота

+0

Вы правы, я просто забыл скопировать строку «getEntityManager(). Flush();». Но в первом примере объект не удаляется из базы данных и все еще существует в коллекции «house.getRooms()». – jaroh

+0

Я думаю, вы должны установить 'room.setHouse (null)' перед удалением комнаты, чтобы указать, что Hibernate ваш единственный объект (не удаленный с помощью 'List.remove()') еще не прикреплен к какому-либо дому и может быть безопасно удален –

Смежные вопросы