-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: joined-subclass mit map und one-to-many Beziehung
PostPosted: Wed Apr 25, 2007 4:41 am 
Newbie

Joined: Wed Apr 25, 2007 4:30 am
Posts: 3
Hallo,
ich hab folgendes Problem bei dem ich seit längerem nicht weiter komme:

Ich hab 3 Klassen: Statistic, StandardStatistic und StandardStatisticEntry.
StandardStatistic ist von Statistic abgeleitet und besitzt ein Map mit Einträgen vom Typ StandardStatisticEntry.

Im XML-Mapping-File hab ichs so abgebildet:

<hibernate-mapping package="cwm.bean.statistic">

<class name="Statistic" table="statistic">
<id name="id" column="statistic_id">
<generator class="native"/>
</id>

<property name="createDate" column="date_create" type="date"/>
...

<joined-subclass name="StandardStatistic" table="statistic_output">
<key column="statistic_id"/>
<map name="entries" table="statistic_output" cascade="save-update,delete">
<key column="statistic_id"/>
<map-key type="string" column="property"/>
<one-to-many class="StandardStatisticEntry"/>
</map>
</joined-subclass>

</class>

<class name="StandardStatisticEntry" table="statistic_output">
<id name="id" column="id">
<generator class="native"/>
</id>

<property name="property" column="property" type="string" length="32"/>
<property name="value" column="value" type="string" length="32"/>
<property name="input" column="input" type="string" length="32"/>
</class>

</hibernate-mapping>


In der DB schauts so aus:

Tabelle statistic:

statistic_id, felder...

Tabelle statistic_output:

id (Primärschlüssel), statistic_id (Fremdschlüssel), property, value, input

d.h. in der Tabelle statistic_output gibt es mehrere Datensätze die den selben Fremdschlüssel haben also einem Statistic-Eintrag gehören.

Mein Problem ist nun, dass wenn ich ein Objekt vom Typ StandardStatistic erzeuge und abspeichere Hibernate als erstes 1 Insert auf die Tabelle statistic absetzt und gleich dannach 1 Insert auf die Tabelle statistic_output, dabei wird aber nur der Fremdschlüsselgefüllt und die restlichen Felder sind null. Erst dannach werden so viele Inserts abgesetzt, wie viele Elemente in dem StandardStatistic.map vorhanden sind.

Bsp:
StandardStatistic Objekt wo das Map-Element 2 Einträge vom Typ StandardStatisticEntry hat führt zu folgenden SQL-Statements:

1. Hibernate: insert into statistic (date_create, statistic_class, hash_code, hash_validity, field_info, field_text, flag, hash_version, order_id, input_id, charge_id, fk_machine_id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

2. Hibernate: insert into statistic_output (statistic_id) values (?)

3. Hibernate: insert into statistic_output (value, input, statistic_id, property) values (?, ?, ?, ?)

4. Hibernate: insert into statistic_output (value, input, statistic_id, property) values (?, ?, ?, ?)

5. Hibernate: update statistic_output set statistic_id=?, property=? where id=?

6. Hibernate: update statistic_output set statistic_id=?, property=? where id=?


Das 2. Statement führt eben zu dieser Null-Zeile in der DB und verursacht natürlich Fehler sobald ich die Spallte "property" auf not-null=true setz.
Weiß jemand was an meinem XML-Mapping falsch ist?
Ich vermute es liegt an der polymorphen 1-n Beziehung zwischen Tabellen statistic und statistic_output. Als Beispiele hab ich bis jetzt nur immer 1-1 Beziehungen zwischen der abgeleiteten Tabelle und der Ursprungtabelle.

Außerdem führt meine XML-Konstelation im joined-subclass immer dazu, dass ein foreign-key von statistic_output.statistic_id auf statistic_output.id erzeugt wird. Das führt dazu dass kein Datensatz eingefügt werden kann außer ich lösch den Fremdschlüssel immer per Hand.

Wenn ich die Daten per Hand in die DB eintrage funktioniert das Selektieren und Ändern der Daten einwandfrei.

Bin für jede Hilfe dankbar!!
Viele Grüße
jack-flash


Top
 Profile  
 
 Post subject:
PostPosted: Mon May 14, 2007 6:00 am 
Newbie

Joined: Wed Apr 25, 2007 4:30 am
Posts: 3
Nach längerer Zeit hab ich das Problem gelöst. Und zwar lag das Problem bei der Wahl des polymorphen Zugriffs. Ich hab den Weg "Tabelle je Klasse" gewählt und dieser war eben aus Hibernate-Sicht falsch.
Da in meinem Fall keine direkten neuen Felder hinzukommen, sondern ein Map, welches wieder auf eine neue Beziehung aufbaut, ist die Strategie "Tabelle je Klassenhierarchie" mit einer Discriminator-Spalte.
Nun werden keine unnötigen Inserts abgesetzt und auch keine unnötigen Fremdschlüssel generiert.

Meine Feststellung ist, dass man bei der Wahl der Vererbungs-Abbildung in der DB, sich genau anschaun muss, was Hibernate eigentlich bei welchem Verfahren macht.
Wenn man wie ich bei den abgeleiteten Klassen keine neuen Attribute hat bzw. vor allem Methoden überladen werden sollen, dann ist die Abbildung als "Tabelle je Klassenhierarchie" mit Discriminator am besten geeignet.

Mein Mapping schaut nun so aus

Code:

<class name="Statistic" table="statistic">
    <id name="id" column="statistic_id">
      <generator class="native"/>
    </id>

   <discriminator column="statistic_class" type="string"/>

    <subclass name="StandardStatistic" discriminator-value="1">
      <map name="entries" table="statistic_output" cascade="save-update,delete">
         <key column="statistic_id" not-null="true"/>
         <map-key type="string" column="property"/>
         <one-to-many class="StandardStatisticEntry"/>
      </map>
   </subclass>
   
   <subclass name="SingleStatistic" discriminator-value="2">
      <bag name="entries" table="statistic_singleval" cascade="save-update,delete">
         <key column="statistic_id" not-null="true"/>
         <one-to-many class="SingleStatisticEntry"/>
      </bag>
   </subclass>
</class>

<class name="StandardStatisticEntry" table="statistic_output">
    <id name="id" column="id">
      <generator class="native"/>
    </id>
    ....
  </class>
 
  <class name="SingleStatisticEntry" table="statistic_singleval">
    <id name="id" column="id">
      <generator class="native"/>
    .... 
</class>


Grüße
jack-flash


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.