четверг, 12 февраля 2009 г.

Hibernate: это должен помнить каждый


Долго мучался, разруливая зависимости между сущностями, хранящимися в БД (т.е. персистентными сущностями). Пришлось разобраться с каскадными операциями, в итоге родилась вот такая памятка:

- 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 комментариев:

Lexандр комментирует...

тоже пригодится по этой же теме:
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"

Andrey Yasinetskiy комментирует...

при планировании нового проекта решил отказаться от хибернейтовского xml маппинга вообще, в пользу annotation маппинга с использованием того же Cпрингового HibernateTemplate'а.
При этом заменить пришлось только SessionFactory на AnnotationSessionFactory, все остальное осталось без изменений :)

команда осталась очень довольна :)

имхо, в больших проектах хибернейтовский xml маппинг весьма не удобен.

Samolisov Pavel комментирует...

У нас в проекте тоже используется связка Spring+Hibernate (точнее в двух подпроектах). В одном конфигурируем Hibernate с помощью аннотаций, в другом - мэппингами (так исторически сложилось). Код с аннотациями конечно читать легче.

З.Ы. А SessionFactory у нас своя )))

Meowth комментирует...

>> необходимо при комите транзакции, когда делается save() или update() объекта

Если я правильно себе представляю, то не факт, что save или update вызовут commit в БД. Или вы имеете в виду не-БД-коммит?

Samolisov Pavel комментирует...

Я имею ввиду коммит, который будет сделан потом после создания или обновления объекта. Естественно, не методами save() или update(). Спасибо за замечание.

Дмитрий комментирует...

Я так понял, что все эти cascsde = "xxxx" применимы только к xml'кам? где их в аннотации-то прописать? в CascadeType их нету... ПОМОГИТЕ!!!

Pavel Samolisov комментирует...

У аннотаций, задающих ассоциации, как правило есть атрибут cascade, например:

@ManyToOne(cascade = CascadeType.ALL)
private Vendor vendor;

Соответственно, нужно только в JavaDoc по CascadeType прочитать какие есть варианты и найти соответствие между ними и перечисленными мною в статье.

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!