Долго мучался, разруливая зависимости между сущностями, хранящимися в БД (т.е. персистентными сущностями). Пришлось разобраться с каскадными операциями, в итоге родилась вот такая памятка:
- cascade="none" - значение по умолчанию. Hibernate будет игнорировать ассоциации, поэтому разруливать зависимости придется самостоятельно.
- cascade="save-update" говорит Hibernate'у, что разруливать зависимости необходимо при комите транзакции в которой делается save() или update() объекта. Суть разруливания заключается в том, что новые объекты, с которыми есть ассоциации у нашего, будут сохранены до него. Это позволяет обойти constraint-violations.
- cascade="delete" говорит Hibernate'у, что надо разруливать зависимости при удалении объекта.
- cascade="all" обозначает выполнение каскадных операций при save-update и delete.
- cascade="all-delete-orphan" обозначает то же самое, что и cascade="all", но к тому же Hibernate удаляет любые связанные сущности, удаленные из ассоциации (например, из коллекции).
- cascade="delete-orphan" обозначает, что Hibernate будет удалять любые сущности, которые были удалены из ассоциации.
Думаю такая краткая памятка будет полезна не только мне.
Понравилось сообщение - подпишись на блог
7 комментариев:
тоже пригодится по этой же теме:
http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#objectstate-transitive
"You may even use cascade="all" to specify that all operations should be cascaded along the association"
при планировании нового проекта решил отказаться от хибернейтовского xml маппинга вообще, в пользу annotation маппинга с использованием того же Cпрингового HibernateTemplate'а.
При этом заменить пришлось только SessionFactory на AnnotationSessionFactory, все остальное осталось без изменений :)
команда осталась очень довольна :)
имхо, в больших проектах хибернейтовский xml маппинг весьма не удобен.
У нас в проекте тоже используется связка Spring+Hibernate (точнее в двух подпроектах). В одном конфигурируем Hibernate с помощью аннотаций, в другом - мэппингами (так исторически сложилось). Код с аннотациями конечно читать легче.
З.Ы. А SessionFactory у нас своя )))
>> необходимо при комите транзакции, когда делается save() или update() объекта
Если я правильно себе представляю, то не факт, что save или update вызовут commit в БД. Или вы имеете в виду не-БД-коммит?
Я имею ввиду коммит, который будет сделан потом после создания или обновления объекта. Естественно, не методами save() или update(). Спасибо за замечание.
Я так понял, что все эти cascsde = "xxxx" применимы только к xml'кам? где их в аннотации-то прописать? в CascadeType их нету... ПОМОГИТЕ!!!
У аннотаций, задающих ассоциации, как правило есть атрибут cascade, например:
@ManyToOne(cascade = CascadeType.ALL)
private Vendor vendor;
Соответственно, нужно только в JavaDoc по CascadeType прочитать какие есть варианты и найти соответствие между ними и перечисленными мною в статье.
Отправить комментарий
Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!