-->
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.  [ 8 posts ] 
Author Message
 Post subject: Ein simples Mapping gelingt mir nicht :-(
PostPosted: Fri Aug 05, 2005 2:26 am 
Newbie

Joined: Mon Feb 28, 2005 11:09 am
Posts: 7
Hallo,

ich lerne gerade Hibernate und versuche mich mit einem simplen Mapping. Leider tue ich mich sehr schwer mit Hibernate, vielleicht könnt Ihr ein wenig helfen. Ich habe zwei Klassen, eine Kasse
Person (int id, String name, Adresse adresse) und eine Klasse
Adresse (int id, String Strasse, String Hausnummer). Diese beiden Klassen will ich nun auf folgende Tabellen mappen:

Personen (identity id, varchar name, int adresseID) und Adressen (identity id, varchar strasse, varchar hausnummer).

Für das Beispiel soll eine 1:1 Beziehung gelten, eine Person hat immer nur eine Adresse. Klar sind mir alle einfachen Felder, allerdings klappt es mit dem mapping der Adresse nicht.

Für meinen Geschmack müsste es ein <one-to-one> tag sein, dann lädt mir Hibernate aber immer die Adresse, bei der Adresse.id=Person.id ist.

Kann mir jemand mit dem mapping weiterhelfen ?



Hibernate version:3

Mapping documents:
Code:
<class name="de.hannit.fsch.Person" table="Personen">
<id name="id" column="id">
<generator class="identity" />
</id>
<property name="name" type="string" column="name" />
<property name="adresseID" type="int" />

<one-to-one name="adresse"  class="de.hannit.fsch.Adresse" cascade="all"/>
</class>


Code between sessionFactory.openSession() and session.close():

Full stack trace of any exception that occurs:

Name and version of the database you are using:`MSSQLServer
[/code]


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 05, 2005 2:55 am 
Newbie

Joined: Tue Jul 26, 2005 7:10 am
Posts: 5
Weiß nicht, ob das genau das ist, was du haben willst, aber das sollte so gehen:

Code:
<class name="de.hannit.fsch.Person" table="Personen">
<id name="id" column="id">
<generator class="identity" />
</id>
<property name="name" type="string" column="name" />
<many-to-one
  name="adresse"
  class="de.hannit.fsch.Adresse"
  column="adresseID"
  type="int"/>
</class>

<class name="de.hannit.fsch.Adresse" table="Adresse">
...
<one-to-one
  name="person"
  class="de.hannit.fsch.Person"
  property-ref="adresse"/>
</class>


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 05, 2005 11:07 am 
Newbie

Joined: Mon Feb 28, 2005 11:09 am
Posts: 7
Hallo,

vielen Dank für Deine Antwort, aber leider passt das so nicht. Die Adresse Klasse hat ja eigentlich überhaupt keine Verbindung zur Elternklasse Person.

Ich habe mal einen Screenshot von der View gemacht, schaut doch bitte mal drauf, eigentlich kann das nicht so schwer sein. (Dies ist das real-world Modell, da ist Person = Einrichtung)
http://www.dumann.de/HibernateProblem.jpg

<class name="de.hannit.fsch.Adresse" table="Adresse">
...
<one-to-one
name="person"
class="de.hannit.fsch.Person"
property-ref="adresse"/>
</class>


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 05, 2005 11:22 am 
Newbie

Joined: Mon Feb 28, 2005 11:09 am
Posts: 7
ich hab grad gesehen, das ich das img direkt reinhängen kann, dann mach ich das mal:
Image


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 07, 2005 7:38 am 
Newbie

Joined: Wed Mar 16, 2005 11:06 am
Posts: 10
horstbrack wrote:
Hallo,

vielen Dank für Deine Antwort, aber leider passt das so nicht. Die Adresse Klasse hat ja eigentlich überhaupt keine Verbindung zur Elternklasse Person.

Ich habe mal einen Screenshot von der View gemacht, schaut doch bitte mal drauf, eigentlich kann das nicht so schwer sein. (Dies ist das real-world Modell, da ist Person = Einrichtung)
http://www.dumann.de/HibernateProblem.jpg

<class name="de.hannit.fsch.Adresse" table="Adresse">
...
<one-to-one
name="person"
class="de.hannit.fsch.Person"
property-ref="adresse"/>
</class>


Es gibt zwei Möglichkeiten für eine one-to-one Assoziation:
1. foreign key association
2. primary key association

Was Du als erstes versucht hast, war die primary key association. Dabei hat die zu Person gehörige Adresse immer den selben Primary Key wie die Person und kann so gefunden werden.
Nachteil: keine DB Konsistenzüberprüfung. Außerdem kann Person dann nur genau eine Adresse haben. Nicht irgendwann zwei, z.B. Home und Work.

Bei der ersten Möglichkeit (foreign-key association) ist Personen.adresseID ein foreign key auf Adressen.id. Um auszuschließen, dass zwei Personen auf dieselbe Adresse zeigen, musst Du der DB sagen, dass Personen.adresseID unique ist.
Das kannst Du auch im Mapping-File unterbringen, wird aber IMHO nur benötigt, falls Du aus den Mappings die create-tables machen willst (hbm2dll).
Außerdem definierst Du im Mapping tatsächlich eine many-to-one Beziehung, weil das für Hibernate keinen Unterschied macht.
Das sähe dann so aus wie Holger beschrieben hat (um unique ergänzt):

<class name="de.hannit.fsch.Person" table="Personen">
...
<many-to-one
name="adresse"
class="de.hannit.fsch.Adresse"
column="adresseID"
cascade="all"
<!-- unique und type werden IMHO nur für hbm2dll benötigt -->
unique="true"
type="int"/>
...

Das von Holger erwähnte one-to-one Element im Adresse-Mapping kannst Du weglassen, wenn Du nicht von Adresse zu Person navigieren möchtest.

Gruß
Sebastian


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 07, 2005 3:03 pm 
Newbie

Joined: Mon Feb 28, 2005 11:09 am
Posts: 7
Hallo,

Es gibt zwei Möglichkeiten für eine one-to-one Assoziation:
1. foreign key association
2. primary key association

Vielen Dank für die Erläuterungen. Irgendwie stehen in der Doku eine Menge Beispiele, aber ich werde nicht so recht schlau draus. Es scheint immer nicht so ganz auf meine Klassen zu passen.

<class name="de.hannit.fsch.Person" table="Personen">
...
<many-to-one
name="adresse"
class="de.hannit.fsch.Adresse"
column="adresseID"
cascade="all"
<!-- unique und type werden IMHO nur für hbm2dll benötigt -->
unique="true"
type="int"/>
...

Ich habe die Klasse um das unique Attribut ergänzt, aber weiter als bisher komme ich auch nicht:
Code:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: de.hannit.fsch.benutzerverwaltung.Adresse
   org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
   org.hibernate.type.EntityType.getIdentifier(EntityType.java:99)
   org.hibernate.type.EntityType.isDirty(EntityType.java:216)
   org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:412)
   org.hibernate.persister.entity.BasicEntityPersister.findDirty(BasicEntityPersister.java:2538)
   org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:344)
   org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:108)
   org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:190)
   org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:70)
   org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
   org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
   org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
   org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
   de.hannit.fsch.datenbank.HibernateServlet.doGet(HibernateServlet.java:47)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


Die Adresse wird also wohl nicht weggeschrieben. Ob der wohl irgendwie mit der identity nicht klar kommt ?


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 07, 2005 3:50 pm 
Newbie

Joined: Wed Mar 16, 2005 11:06 am
Posts: 10
Dann poste doch mal Deine kompletten Mapping Files für die beiden Klassen und den Code, bei dem die Exception geworfen wird. Also am besten alles, was dabei mit der Session zu tun hat.[/code]


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 07, 2005 4:02 pm 
Newbie

Joined: Mon Feb 28, 2005 11:09 am
Posts: 7
Hi,

ich habe es jetzt hinbekommen. Es musste so aussehen:
Code:
<many-to-one    name="adresse"
class="de.hannit.fsch.benutzerverwaltung.Adresse"
column="adresseID"
cascade="all" />


Vielen Dank für Eure Hilfe.


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