-->
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.  [ 3 posts ] 
Author Message
 Post subject: Mapping von Composite-Id's mit Composite-Id's
PostPosted: Thu Aug 13, 2009 10:57 am 
Newbie

Joined: Thu Aug 13, 2009 10:03 am
Posts: 3
Hallo Hibernate Community,

seit einiger Zeit verwende ich erfolgreich Hibernate mit Java und neuerdings auch NHibernate mit C# (Großes Lob an die Entwickler und die Community).

Ich habe leider eine etwas "unglücklich" strukturierte Datenbank vorliegen, bei der ich das Mapping nicht hinbekomme. Das Problem sind zusammengesetzte Schlüssel, die als Fremdschlüssel in einen zusammengesetzten Schlüssel einfliessen :-( (Bild mit ER-Modell konnte ich leider nicht hochladen).


Mein Generator hat mir folgende Dateien erzeugt:

LisMesswert.hbm.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Wip.Framework.DataModels.LIS.LisMesswert,Wip.Framework.DataModels.LIS" table="LIS_MESSWERT" lazy="true" optimistic-lock="none" dynamic-update="true">
    <composite-id name="Id" class="Wip.Framework.DataModels.LIS.LisMesswertId,Wip.Framework.DataModels.LIS">
      <key-property name="LisAnalysemerkmalId" type="Wip.Framework.DataModels.LIS.LisAnalysemerkmalId,Wip.Framework.DataModels.LIS">
        <column name="LIS_ANALYSEAUFTRAG_ID" />
        <column name="LIS_MERKMAL_ID"/>
      </key-property>
      <key-property name="LisProbeId" column="LIS_PROBE_ID" type="Decimal" />
    </composite-id>
    <property name="LisLoveWertTypId" column="LIS_LOVE_ID" type="Decimal" not-null="true" />
    <many-to-one name="LisLoveWertTypObj" column="LIS_LOVE_ID" cascade="none" not-null="true" />
    <property name="NumWert" column="NUM_WERT" type="Decimal" not-null="false" />
    <property name="AlphaWert" column="ALPHA_WERT" type="string" not-null="false" length="1024" />
    <property name="ZeitWert" column="ZEIT_WERT" type="DateTime" not-null="false" />
    <property name="Dimension" column="DIMENSION" type="string" not-null="false" length="16" />
    <property name="Undefiniert" column="UNDEFINIERT" type="Decimal" not-null="false" />
    <property name="Unplausibel" column="UNPLAUSIBEL" type="Decimal" not-null="false" />
    <property name="Ungueltig" column="UNGUELTIG" type="Decimal" not-null="false" />
    <property name="Manuell" column="MANUELL" type="Decimal" not-null="false" />
    <property name="LisEinheitId" column="LIS_EINHEIT_ID" type="Decimal" />
    <many-to-one name="LisEinheitObj" column="LIS_EINHEIT_ID" cascade="none" />
    <property name="Ersatzwert" column="ERSATZWERT" type="Decimal" not-null="false" />
    <property name="NumErsatzwert" column="NUM_ERSATZWERT" type="string" not-null="false" length="16" />
    <property name="CalcErsatzwert" column="CALC_ERSATZWERT" type="Decimal" not-null="false" />
    <property name="LisAnalyseauftragId" column="LIS_ANALYSEAUFTRAG_ID" type="Decimal" not-null="true" />
    <property name="LisMerkmalId" column="LIS_MERKMAL_ID" type="Decimal" not-null="true" />
    <property name="LisProbeId" column="LIS_PROBE_ID" type="Decimal" not-null="true" />
  </class>
</hibernate-mapping>


LisMesswert.cs:
Code:
   [Serializable]
   public partial class LisMesswert : EntityBase {
      #region Member Variables
      protected LisMesswertId _id;
      protected decimal _lisLoveWertTypId;
      protected LisLove _lisLoveWertTypObj;
      protected decimal? _numWert;
      protected string _alphaWert;
      protected DateTime? _zeitWert;
      protected string _dimension;
      protected decimal? _undefiniert;
      protected decimal? _unplausibel;
      protected decimal? _ungueltig;
      protected decimal? _manuell;
      protected decimal _lisEinheitId;
      protected LisEinheit _lisEinheitObj;
      protected decimal? _ersatzwert;
      protected string _numErsatzwert;
      protected decimal? _calcErsatzwert;
      protected decimal _lisAnalyseauftragId;
      protected decimal _lisMerkmalId;
      protected decimal _lisProbeId;
      #endregion
...


LisMesswertId:
Code:
[Serializable]
   public partial class LisMesswertId : EntityBase {
      #region Member Variables
      protected LisAnalysemerkmalId _lisAnalysemerkmalId;
      protected LisAnalysemerkmal _lisAnalysemerkmalObj;
      protected decimal _lisProbeId;
      protected LisProbe _lisProbeObj;
      #endregion
...


LisAnalysemerkmal.hbm.xml
Code:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <!--Build: with lujan99@usa.net Nhibernate template-->
  <class name="Wip.Framework.DataModels.LIS.LisAnalysemerkmal,Wip.Framework.DataModels.LIS" table="LIS_ANALYSEMERKMAL" lazy="true" optimistic-lock="none" dynamic-update="true">
    <composite-id name="Id" class="Wip.Framework.DataModels.LIS.LisAnalysemerkmalId,Wip.Framework.DataModels.LIS">
      <key-property name="LisAnalyseauftragId" column="LIS_ANALYSEAUFTRAG_ID" type="Decimal" />
      <key-property name="LisMerkmalId" column="LIS_MERKMAL_ID" type="Decimal" />
    </composite-id>
...
<bag name="LisMesswertList" inverse="true" lazy="true" cascade="none">
      <key>
        <column name="LIS_ANALYSEAUFTRAG_ID" />
        <column name="LIS_MERKMAL_ID" />
      </key>
      <one-to-many class="Wip.Framework.DataModels.LIS.LisMesswert,Wip.Framework.DataModels.LIS" />
    </bag>
    <property name="LisMerkmalId" column="LIS_MERKMAL_ID" type="Decimal" not-null="true" />
    <many-to-one name="LisMerkmalObj" column="LIS_MERKMAL_ID" cascade="none" not-null="true" />
    <property name="LisAnalyseauftragId" column="LIS_ANALYSEAUFTRAG_ID" type="Decimal" not-null="true" />
    <many-to-one name="LisAnalyseauftragObj" column="LIS_ANALYSEAUFTRAG_ID" cascade="none" not-null="true" />
  </class>


LisAnalysemerkmalId:
Code:
[Serializable]
   public partial class LisAnalysemerkmalId : EntityBase {
      #region Member Variables
      protected decimal _lisAnalyseauftragId;
      protected LisAnalyseauftrag _lisAnalyseauftragObj;
      protected decimal _lisMerkmalId;
      protected LisMerkmal _lisMerkmalObj;
      #endregion
...


Sobald NHibernate versucht meine Klassen zu mappen, erhalte ich folgende Fehlermeldung:
Code:
Fehler beim Initialisieren von NHibernate
NHibernate.MappingException: identifier mapping has wrong number of columns: Wip.Framework.DataModels.LIS.LisMesswert type: component[LisAnalysemerkmalId,LisProbeId]


Hat schon jemand mit derartigen Schlüsseln zu tun gehabt? Bin dankbar für jede Unterstützung.

Grüße Michael


Top
 Profile  
 
 Post subject: Re: Mapping von Composite-Id's mit Composite-Id's
PostPosted: Fri Aug 14, 2009 9:35 am 
Newbie

Joined: Thu Aug 13, 2009 10:03 am
Posts: 3
Hallo nochmal,

habe jetzt noch ein bildchen hochgeladen, vielleicht hift das beim Verständnis meines Problems.

Image


Top
 Profile  
 
 Post subject: Re: Mapping von Composite-Id's mit Composite-Id's
PostPosted: Mon Aug 17, 2009 6:51 am 
Newbie

Joined: Thu Aug 13, 2009 10:03 am
Posts: 3
Hallo,

nach langem hin und her konnte ich mein Problem lösen. Die Lösung scheint simpler als gedacht.

Mein Problem mit der unstimmigen Anzahl der Columns konnte ich durch das Element "key-many-to-one" Element lösen. Der Composite-key der LisMesswert.hbm.xml sieht bei mir jetzt folgendermaßen aus.

Code:
<composite-id name="Id" class="Wip.Framework.DataModels.LIS.LisMesswertId,Wip.Framework.DataModels.LIS">
      <key-many-to-one name="LisAnalysemerkmalId" class="Wip.Framework.DataModels.LIS.LisAnalysemerkmalId,Wip.Framework.DataModels.LIS" >
        <column name="LIS_ANALYSEAUFTRAG_ID" sql-type="Decimal"/>
        <column name="LIS_MERKMAL_ID" sql-type="Decimal"/>
      </key-many-to-one>
      <key-property name="LisProbeId" column="LIS_PROBE_ID" type="Decimal" />
    </composite-id>


Zusätzlich war ich gezwungen für den Analyseauftrag Composite-key auch eine eigene Mappingdatei anzulegen.

Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Wip.Framework.DataModels.LIS.LisAnalysemerkmalId,Wip.Framework.DataModels.LIS" table="LisAnalysemerkmal" lazy="true" optimistic-lock="none" dynamic-update="true">
    <composite-id>
      <key-property name="LisAnalyseauftragId" column="LIS_ANALYSEAUFTRAG_ID" type="Decimal" />
      <key-property name="LisMerkmalId" column="LIS_MERKMAL_ID" type="Decimal" />
    </composite-id>
    <property name="LisMerkmalId" column="LIS_MERKMAL_ID" type="Decimal" not-null="true" />
    <many-to-one name="LisMerkmalObj" column="LIS_MERKMAL_ID" cascade="none" not-null="true" />
    <property name="LisAnalyseauftragId" column="LIS_ANALYSEAUFTRAG_ID" type="Decimal" not-null="true" />
    <many-to-one name="LisAnalyseauftragObj" column="LIS_ANALYSEAUFTRAG_ID" cascade="none" not-null="true" />
  </class>
</hibernate-mapping>


Jetzt bekomme ich meine schönen Werte.

Grüße MPawel


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.