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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ОтветитьУдалить

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