2010-11-25 3 views
4

Я не специалист с спящим режимом, как указано в теме, у меня есть Объект с коллекцией объекта в нем. Я пытался использоватьhibernate не удаляет дочерний элемент с именованным запросом, но удаляет с session.delete()

session.delete(myObject) 

и сущность со всеми связанными детьми получает правильно удален из базы данных.

Однако, когда я бегу простой именованный запрос:

<query name="deleteByID"> 
    DELETE FROM MyObject o WHERE o.objId IN (:objIds) 
</query> 

, а затем в коде

Query deleteQuery = s.getNamedQuery("deleteByID"); 
deleteQuery.setParameterList("objIds", objIds); 
return deleteQuery.executeUpdate(); 

но только удаляется основной объект, в то время как дети остаются в базе данных. Коллекция правильно помечена как сирот-сирот. Я хотел знать, почему такое поведение, и если возможно, как добиться полного удаления с помощью именованных запросов.

ответ

4

Это известная проблема, hibernate не выполняет каскадное удаление через HQL. Если вы загружаете объект и удаляете его с помощью session.delete(object);, то отношения каскада соблюдаются. Не через HQL. У вас есть один из 3 вариантов.

  • Загрузите их и вызовите session.delete();
  • Загрузить все дочерние элементы с помощью HQL, удалите их, а затем реальные объекты.
  • Поместите каскадную ссылку на уровне базы данных. Поэтому, когда вы удаляете его, DB позаботится об этом.

Подробнее здесь: https://forum.hibernate.org/viewtopic.php?f=1&t=944722&start=0

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