Обходные пути для 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 и решения проблемы удаления сирот.

Ответ 4

Записывать базу данных в триггер обновления по дочерней таблице. Если родительский ключ равен null, удалите запись из дочернего