Обходные пути для Hibernate не поддерживают сиротскую поддержку для отношений "один-к-одному" и "много-к-одному"?
Hibernate не поддерживает каскадирование "удаление-сирота" отношений "один-к-одному" или "многие-к-одному". Недавно я обнаружил это, и это придало мне серьезную головную боль. У меня есть пара классов в моей модели, которые были спроектированы таким образом, что у ребенка нет реального значения для мира вне родителя. У меня только один DAO для родителя, а не отдельный DAO для дочернего класса.
Это работает:
parent.getChild().setProperty("something");
parentDao.save(parent);
Это ничего не делает:
parent.setChild(null);
parentDao.save(parent);
Это очень неудачно, потому что теперь я должен переосмыслить свой уровень DAO и несколько операций моего уровня обслуживания.
Кто-нибудь работал с этим ограничением элегантным способом? Я действительно хотел бы только заботиться о сохраняющихся родительских объектах. В этом конкретном случае нет причин иметь дело с настойчивостью детей, кроме того, чтобы сделать Hibernate счастливым и только в случае удаления детей.
Ответы
Ответ 1
Похоже, что он обращается в рамки, к которым они МОГУТ обратиться, надеюсь, скоро
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2608
Этот билет был открыт в 2007 году, и последний пост, жалующийся на проблему, был таким же недавним, как месяц назад.
То, что я делаю, это помещение свойства на мой объект, называемый isMarkedForDeletion. И если это возвращает true, у меня есть dao или моя служба, явное удаление. Он определенно НЕ так хорош, как delete-orphan, но он работает достаточно хорошо в рамках spring + hibernate.
Я буду следить за этим сообщением, так как это ОЧЕНЬ важный вопрос.
Ответ 2
Обходной путь, описанный здесь https://forum.hibernate.org/viewtopic.php?p=2379216, работал на меня. Он использует ассоциацию @OneToMany с одним элементом на стороне "много" для реализации ассоциации @OneToOne и решения проблемы удаления сирот.
Ответ 3
Хеурека, зафиксированная в Hibernate 4.27
https://hibernate.atlassian.net/browse/HHH-6484
(не проверено)
Ответ 4
Записывать базу данных в триггер обновления по дочерней таблице. Если родительский ключ равен null, удалите запись из дочернего