CascadeType.Persist не работает должным образом - PullRequest
2 голосов
/ 29 июля 2011

У меня есть следующий код (упрощенно, конечно):

 @Entity
 public class Foo {
   @Generated
   private Long id;
   @OneToMany(mappedBy=foo)
   @Cascade(CascadeType.PERSIST)
   private Collection<Bar> bars;
   ...
 }

 @Entity
 public class Bar {
   @Generated
   private Long id;
   @ManyToOne
   @NotNull
   private Foo foo;
   ...
 }

Из многих примеров, которые я видел, это должно работать:

 Foo foo = new Foo();
 Bar bar = new Bar();
 bar.setFoo(foo);
 Bar bar2 = new Bar();
 bar2.setFoo(foo);
 foo.bars.add(bar);
 foo.bars.add(bar2);
 hibernateTemplate.save(foo);

Когда я говорю "это должно работать "Я имею в виду, что я ожидаю, что когда я посмотрю на таблицу БД Foo, у меня будет строка для Foo (предположим, с id = 1) и две строки в Bar, каждая со значением 1 (idof foo) в столбце foo_id.

В действительности происходит следующее: я получаю исключение:

org.hibernate.PropertyValueException: not-null property references a null or transient   value:

на Bar.foo.Если я удаляю @NotNull, сохранение завершается успешно, но в столбце foo_id у меня есть ноль, а не значение 1.

Так что мой вопрос: является ли это известной ошибкой в ​​Hibernate, которая не работает при сохранении Cascadeили я просто не понимаю, как его использовать?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2014

Это не ошибка, но плохо документировано

CascadeType.PERSIST работает с hibernateTemplate.persist(foo) CascadeType.SAVE_UPDATE работает с hibernateTemplate.save(foo)

Смотрите здесь для 4 отличий между .persist (foo) и .save (foo)

Видите ли вы, что вы используете аннотации Hibernate (не JPA)

org.hibernate.annotations.Cascade
org.hibernate.annotations.CascadeType
2 голосов
/ 29 июля 2011

Это не ошибка, просто так все работает, так сказать.Cascade Persist позаботится о том, чтобы положить вещи в базу данных для вас через транзитивное постоянство, поэтому вам не нужно явно сохранять столбцы.Тем не менее, вы всегда должны поддерживать состояние объектов в памяти.Вы должны установить Foo на панели.Hibernate не может автоматически сделать эту часть для вас.Cascade Persist не позволяет вам вызывать save(bar); save(bar2);, но объекты все равно должны находиться в правильном состоянии памяти, когда сеанс пытается их очистить.

1 голос
/ 24 января 2012

Возможно, вы смешиваете аннотации JPA и Hibernate.

Проверьте, используете ли вы этот CascadeType: org.hibernate.annotations.CascadeType

Более подробное объяснение можно найти в этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...