Hibernate обновляет вместо вставки, почему? - PullRequest
2 голосов
/ 25 мая 2011

Я начинаю свое приключение с Hibernate, поэтому наберитесь терпения :) Я хочу сделать сопоставление для двух таблиц, например, A и B. Отношение между A и B однозначно. Я написал этот файл hbm.xml:

 <hibernate-mapping package="something">
   <class name="A" table="A">
   <id name="id" type="int" column="ID">
      <generator class="native" />
   </id>
   <set name="setInA" sort="natural" cascade="all" lazy="false">
     <key column="ANOTHER_ID"/>
     <one-to-many class="B" />
   </set>
   </class>

  <class name="B" table="B">
   <id name="anotherId" type="int" column="ANOTHER_ID">
      <generator class="native" />
   </id>
   </class>
</hibernate-mapping>

Конечно, я также сделал классы POJO A и B.

А теперь, когда я пытаюсь сделать:

A a = new A();
Set<B> set = new TreeSet<B>();
set.add(new B());
a.setSetInA(set);
session.save(a);

Hibernate вставляет новую строку в таблицу A, но (что является худшим) не вставляет новую строку в таблицу B, а только делает SQL Update для несуществующей строки в B. Может кто-нибудь сказать мне, почему это происходит? Что я сделал не так?

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Вы должны сначала сохранить объекты B, либо использовать опцию Cascade.

0 голосов
/ 28 мая 2018

Нашел этот вопрос при поиске причин тех же симптомов в моей системе.cascade = "all" не помогло.

В моем случае я решил эту проблему, добавив сопоставление в элемент списка, в этом примере класс B.

Обратите внимание, что включающий класс (A в этом примере) также был версионным.Hibernate может потребовать, чтобы управление версиями (используемое для оптимистической блокировки) было включено для всех вложенных элементов.Я не нашел никакой документации, подтверждающей эту теорию.

0 голосов
/ 25 мая 2011

Вы можете использовать Каскад без использования аннотаций:

<set name="setInA" sort="natural" cascade="all" lazy="false" cascade="all">
     <key column="ANOTHER_ID"/>
     <one-to-many class="B" />
   </set>

Это обеспечит вставку коллекции экземпляров B при вставке A.

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