Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate, many-to-many, проблема при сохранении?


Автор: unkis 11.12.2006, 18:45
Ребята у меня следующая проблема:

При сохранении  в базу данных двух объектов имеющих между собой m:n отношения, не сохраняются данные в общую таблицу  между этими двумя объектами, при этом сами объекты каждый в сою таблицу сохраняется.

В моём случаи есть обекты 

Client 0..*-------------0..* Produkt

После генерации в базе данных будет три таблицы:

Cleint -----------client_produkt---------Produkt

так вот в таблицу Client и Produkt данные сохраняются, а в client_produkt нет.

Вопрос почему?

вот мои маппинги.

Client.hbm.xml

Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping schema="PUBLIC" package="auktion"> 
  <class name="Client" table="client" schema="PUBLIC" optimistic-lock="none"> 
    <id name="id" type="integer" unsaved-value="null" column="id">
      <generator class="native"/>
    </id>
    <list name="auktion" table="auktion_client" cascade="all,delete-orphan"> 
      <key foreign-key="auktion_id" column="auktion_id"/>
      <list-index column="idx_1"/>
      <many-to-many entity-name="auktion.Auktion" foreign-key="client_id" column="client_id"/>
    </list>
    <list name="gebot" cascade="none"> 
      <key foreign-key="gebot_id" column="gebot_id"/>
      <list-index column="gebot_idx"/>
      <one-to-many entity-name="auktion.Gebot"/>
    </list>
    <list name="vorgemerkteProdukts" table="client_produkt" invers="true" cascade="all"> 
      <key foreign-key="vorgemerkteProdukts_id" column="vorgemerkte_produkts_id"/>
      <list-index column="idx"/>
      <many-to-many entity-name="auktion.Produkt" foreign-key="clients_id" column="clients_id"/>
    </list>
  </class>
</hibernate-mapping>



Produkt.hbm.xml

Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping schema="PUBLIC" package="auktion"> 
  <class name="Produkt" table="produkt" schema="PUBLIC" optimistic-lock="none"> 
    <id name="id" type="integer" unsaved-value="null" column="id">
      <generator class="native"/>
    </id>
    <property name="preis" type="big_decimal" column="preis"/>
    <property name="ebayID" type="string" column="ebayid"/>
    <property name="beschreibung" type="string" column="beschreibung"/>
    <list name="clients" table="client_produkt" cascade="all" invers="true"> 
      <key foreign-key="clients_id" column="clients_id"/>
      <list-index column="idx_1"/>
      <many-to-many entity-name="auktion.Client" foreign-key="vorgemerkteProdukts_id" column="vorgemerkte_produkts_id"/>
    </list>
  </class>
</hibernate-mapping>


Сохраняю вот так
Код

            Client client = new Client();
            Produkt produkt = new Produkt();
            produkt.addClients(client);
            produkt.setEbayID("123456789");
            produkt.setPreis(new BigDecimal(569));
            produkt.setBeschreibung("Produkt 3");
                      
            session.save(produkt);


P.s: вопрос обсуждался в другом топику  http://forum.vingrad.ru/topic-125708.html

Автор: tux 11.12.2006, 19:05
Код

<list name="clients" table="client_produkt" inverse="true"> 
    <key foreign-key="clients_id" column="clients_id"/>
    <many-to-many class="auktion.Client" column="vorgemerkte_produkts_id"/>
</list>

в Produkt.hbm.xml. Что получится?

Не надо больше создавать дублирующиеся темы!!!

Автор: unkis 11.12.2006, 19:16
Извиняюсь но я не понимаю вопроса что значит?
Цитата

в Produkt.hbm.xml. Что получится?



Автор: tux 11.12.2006, 19:59
Берем вот это
Код

<list name="clients" table="client_produkt" inverse="true"> 
    <key foreign-key="clients_id" column="clients_id"/>
    <many-to-many class="auktion.Client" column="vorgemerkte_produkts_id"/>
</list>

заменяем вот это в Produkt.hbm.xml на то, что выше
Код

<list name="clients" table="client_produkt" cascade="all" invers="true"> 
   <key foreign-key="clients_id" column="clients_id"/>
   <list-index column="idx_1"/>
   <many-to-many entity-name="auktion.Client" foreign-key="vorgemerkteProdukts_id" column="vorgemerkte_produkts_id"/>
</list>

Что в результате получилось? Заработало или нет?

Автор: unkis 11.12.2006, 20:30
так не должно работать, так как у elemt List всегда должен быть атрибут  <list-index column="idx_1"/>, так как list гарантирует порядок и hibernate должен об этом знать, и это возможно только при помощи <list-index column="idx_1"/>.
По моему так стояло в документации, хотя сейчас попробую.

Добавлено @ 20:32 
как я и говорил не работает

Автор: tux 11.12.2006, 20:54
А если list-index вернуть?

Автор: unkis 11.12.2006, 21:28
если вернуть list-index

то получается следующий маппинг:
Код

 <list name="clients" table="client_produkt"  inverse="true"> 
   <key foreign-key="clients_id" column="clients_id"/>
   <list-index column="idx_1"/>
   <many-to-many entity-name="auktion.Client" foreign-key="vorgemerkteProdukts_id" column="vorgemerkte_produkts_id"/>
</list>


то есть практически то что у меня било за исключением отсутствия cascade="all".

то выбрасивает следующую ошибку:
Код

No row with the given identifier exists: [auktion.Client#1]
     [java] Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [auktion.Client#1]
     [java] at org.hibernate.ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27)
     [java] at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:65)
     [java] at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
     [java] at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
     [java] at auktion.Client$$EnhancerByCGLIB$$6c88a723_2.getVorgemerkteProdukts(<generated>)
     [java] at auktion.Hibernate_Test.main(Hibernate_Test.java:89)
     [java] Java Result: 1
BUILD SUCCESSFUL


если верну cascade="all" то работает как и раньше

Автор: unkis 11.12.2006, 22:00
ссылка откуда можно скачать мой проект здесь

http://public.rz.fh-wolfenbuettel.de/~barvenko/hibernate/hibernate_proba.zip

Автор: v2v 14.4.2008, 18:15
для unkis это уже наверное не актуально . но у меня вопрос по сабжу .

данная проблема связана с атрибутом inverse=true

Цитата

What about the inverse mapping attribute? For you, and for Java, a bi-directional link is simply a matter of setting the references on both sides correctly. Hibernate however doesn't have enough information to correctly arrange SQL INSERT and UPDATE statements (to avoid constraint violations), and needs some help to handle bi-directional associations properly. Making one side of the association inverse tells Hibernate to basically ignore it,

Books Authors (many-to-many)
в классе Books  есть метод setAuthors
d классе Author есть  метод setBooks 
выходит когда я убираю этот атрибут , то могу сохранять как с одной стороны , так и с другой, но с атрибутом я могу сохранять только с одной стороны , там где в мапинге не установлено inverse=true. 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)