-->
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: unidirectionales Collection mapping
PostPosted: Mon Apr 07, 2008 4:48 am 
Newbie

Joined: Thu Jun 07, 2007 10:23 am
Posts: 9
Hallo,

ich möchte gern ein Collection-Mapping definieren und komme einfach auf keinen grünen Ast.

Quelle ist ein Objekt namens Category das ein paar Labels enthält. Wichtig daran ist, das ein Label immer nur zu einer Category gehöht, ein Label immer eine Sprache hat (en, de etc.) und pro Category das Label über die Sprache eindeutig identifiziert ist.

Category:
Code:
Map<String, Label> getLabels()

liefert eine Map von allen Labels mit der Sprache aus Label als Schlüssel der Map. Label besitzt "lang", "text" und "description" als Felder mit entsprechenden Gettern und Settern.

Beim definieren des Mapping bekomme ich einfach keinen DDL-Output, wie er logisch gesehen sein sollte:

Code:
create table Labels (category integer not null, lang varchar(255), text varchar(255), description varchar(255), primary key (category, lang))


Stattdessen wird "category, lang, text, description" als Primärschlüssel verwendet, was unter MySQL zu zu großen Schlüssel führt und unter DB2 gar nicht funktioniert, weil Teile des Schlüssels NULL werden können
Code:
<map name="labels" cascade="all" table="Labels">
  <key>
     <column name="category"/>
  </key>
  <map-key type="string" formula="lang"/>
  <composite-element class="Label">
    <property name="lang" not-null="true"/>
    <property name="text" />
    <property name="description" not-null="false"/>
  </composite-element>
</map>

Ich habe das auch schon mit einem one-to-many Mapping nach Label probiert, wie in Abschnitt "6.2.5. One-to-many associations" vorgeschlagen. Das funktioniert aber nicht, weil Label ein schwaches Entity ist, das ohne zugehöriges "starkes" Entity nicht existieren kann, weswegen Label keinen Schlüssel hat.

Wie muss so ein Mapping aussehen, damit "category, lang" der Primärschlüssel wird?

Danke im voraus.

Thomas


Top
 Profile  
 
 Post subject: Lösung: unidirectionales Collection mapping
PostPosted: Mon Apr 14, 2008 9:13 am 
Newbie

Joined: Thu Jun 07, 2007 10:23 am
Posts: 9
Nach einer langen Schritt-für-Schritt-Debug-Sitzung habe ich die Lösung in IndexedCollection.createPrimaryKey() gefunden

Code:
         if (isFormula) {
            //if it is a formula index, use the element columns in the PK
            pk.addColumns( getElement().getColumnIterator() );
         }
         else {
            pk.addColumns( getIndex().getColumnIterator() );
         }


Wenn isFormular==true werden alle Spalten Teil des Primärschlüssels. Also musste ich das irgendwie auf "false" setzen, damit nur die Sprache für den Schlüssel genommen wird.

Code:
<map name="labels" cascade="all" table="Labels">
  <key>
     <column name="category"/>
  </key>
  <map-key type="string" column="lang"/>
  <composite-element class="Label">
    <property name="lang" formula="lang"/>
    <property name="text" />
    <property name="description" not-null="false"/>
  </composite-element>
</map>


Jetzt ist die Formel in das composite-element gewandert und referenziert über formula="lang" den map-key.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Apr 21, 2008 4:47 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
composite primary key würde glaube ich auch helfen.

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


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.