# Hibernate - Werte aus 2 Tabellen laden



## y0dA (26. Nov 2007)

Hi!
Folgendes Problem:

Ich habe Tabelle A mit 3 Columns: id, name, desc und Tabelle B mit 2 Columns: length, unit.
Wie geht ihr nun damit um wenn ihr bpsw aus Table A eine Zeile mit der ID = 3 lädt und gleichzeitig aus der Tabelle B den Wert length benötigt? Mit SQL macht man ja einfach einen Join, nur wie löst man das mit Hibernate, da ich ja dann kein geeignetes mapping objekt habe - sprich ich besitze ein mapping für Tabelle A und eines für Tabelle B - aber kein Mapping für beide Tabellen gleichzeitig.

mfg


----------



## SlaterB (26. Nov 2007)

select a.id, b.length from A a, B b where a.id = b.unit

du bekommst eine List<Object[]>


----------



## y0dA (26. Nov 2007)

ja und wenn ich ein list object bekomme muss ich dann casten od wie, deshalb wollte ich ja wissen ob es mit mapping auch geht


----------



## SlaterB (26. Nov 2007)

allgemein kann man Objekte auch über mehrere Tabellen mappen, ja, 
da kann ich aber leider konkret nicht weiterhelfen, Lehrbuch?

parallele Mappings (neben den normalen für A und B) nur für spezielle Anfragen klingen dagegen merkwürding/ gefährlich,
auch dazu nix genaues von meiner Seite


----------



## SnooP (26. Nov 2007)

Also generell sollte man da überlegen, ob die Tabellen nicht auch in der Objektwelt zusammengehören, sprich ob Entität A nicht eine Assoziation zu B bekommen sollte - dann werden die Objekte bereits über ein simples get/load mit eingetütet - per lazy-loading auch entsprechend nur dann, wenn es wirklich benötigt wird (sprich beim Zugriff innerhalb der Session oder explizit via hql).

Ansonsten wenn man ganz frei nen sql/hql absetzt auf zwei unterschiedliche Dinge, kann Hibernate natürlich auch nicht wirklich raten, bzw. wenn man halt mehrere unterschiedliche Objekte in einer Ergebnisliste hat, muss man halt casten 

Wir haben hier manchmal spezielle Mappings für spezielle Entitäten die über mehrere Tabellen gehen also eine Beziehung zwischen mehreren Tabellen/views aufmachen, die einzeln ebenfalls abgedeckt sind - einfach weil es performanter oder vom Zugriff später dadurch einfacher wird... - kann sich also in Einzelfällen evtl. lohnen.


----------



## y0dA (26. Nov 2007)

Leider ist mir das Datenmodell vorgegeben bzw gehören die beiden Tabellen getrennt.



> Wir haben hier manchmal spezielle Mappings für spezielle Entitäten die über mehrere Tabellen gehen also eine Beziehung zwischen mehreren Tabellen/views aufmachen, die einzeln ebenfalls abgedeckt sind - einfach weil es performanter oder vom Zugriff später dadurch einfacher wird... - kann sich also in Einzelfällen evtl. lohnen.


Wie darf man sich das vorstellen, bzw wie sieht so eine mapping datei dann aus?


----------



## ms (26. Nov 2007)

Die Frage ist, wie maki schon gesagt hat, wie die beiden Tabellen in Beziehung miteinander stehen.
Oder anders gefragt, wie sieht denn derzeit dein SQL-Statement für diese Abfrage aus?

ms


----------



## SnooP (26. Nov 2007)

das die beiden Tabellen getrennt gehören ist ja kein Problem für das zusammenlegen auf Objektebene.

Es spricht nichts dagegen in dein Objekt A eine Assoziation (one-to-one) zu dem anderen Objekt zu haben. Auf der DB wird dies ja entsprechend berücksichtigt, sprich die beiden Tabellen so gelassen.

Du brauchst halt eine Entität, die genau die Properties besitzt, die du brauchst. Zusammengeklaubt aus den einzelnen Spalten aller benötigten Tabellen... das mapped man ganz normal und verbindet die Entity dann aber nicht mit einer konkreten Tabelle sondern via manuellem mapping bei einem sql-statement entsprechend...

beim Inserten muss man dann natürlich evtl. nochmal gucken... das Problem hatte ich aber nie - haben sowas für spezielle Select-Objekte gemacht, wenn man irgendwas "größeres" zur Anzeige bringen wollte.


----------



## y0dA (26. Nov 2007)

Es ist eine 1:n Beziehung von Tabelle Feature zu Tabelle Feature_Interconnection. Fremdschlüsselbeziehung Feature.F_ID = Feature_Interconnection.FI_F_ID.

Zur Zeit habe ich hierfür 2 getrennte Stmts, da ich zum damaligen ZEitpunkt noch die Distanz berechnen musste - mittlerweile ist die Distanz aber in den Daten vorhanden.

Stmt sollte schlichtweg so aussehen (da oracle funktionen benutzt werden wohl nur mittels SQL möglich):


```
SELECT *
 FROM feature, feature_interconnection
 WHERE SDO_NN (feature.f_geom,  SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE( 9.65522833333333, 47.346115, null), null, null), ' SDO_NUM_RES = 10 unit=meter', 1) = 'TRUE'
 AND SDO_WITHIN_DISTANCE( feature.f_geom,  SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE( 9.65522833333333, 47.346115, null), null, null), ' DISTANCE = 25 unit=meter') = 'TRUE'
 AND f_ft_id = 1
 AND feature.f_id = feature_interconnection.fi_f_id
```

**EDIT**
Also mach ich nun eine many to one oder eine join beziehung in mein mapping?

```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="at.pcd.wam.technologie.persistence.model">
	<class name="at.pcd.wam.technologie.persistence.model.FeatureModel"
		table="FEATURE">

		
		<id name="id" type="integer" column="F_ID">
		<generator class="assigned" />
		</id>

		<property name="dataSupplierSourceId" type="integer" column="F_DSS_ID" />
		<property name="featureTypeId" type="integer" column="F_FT_ID" />
		<property name="geom" type="at.pcd.wam.technologie.persistence.custom.type.JGeometryType" column="F_GEOM" />
		<property name="insert" type="timestamp" column="F_INSERT" />
		<property name="intersectionId" type="integer" column="F_INTERSECTION_ID" />
		<property name="name" type="string" column="F_NAME" />
		<property name="update" type="timestamp" column="F_UPDATE" />

	</class>
</hibernate-mapping>
```


----------



## SnooP (26. Nov 2007)

das ist eine many-to-one Beziehung mit column= auf die Feature_Interconnection Fremdschlüsselspalte... wenn bijektiv, muss noch ein mappedBy dazukommen... obwohl ich grad nich mehr weiß, wie genau das bei hibernate-xml aussieht... nutze nur noch JPA  da ist das anders.


----------



## ms (26. Nov 2007)

Gut, dann ganz einfach 2 Klassen, die jeweils die genannten Attribute hat und eine many-to-one Definition im mapping der Kindklasse und eine Collection-Definition nach Wahl im mapping in der Elternklasse.

Siehe dazu auch hier: http://www.hibernate.org/hib_docs/reference/en/html/associations.html

Übrigens sollte es möglich sein (habs noch nicht probiert) durch Ableiten von OracleDialect zusätzliche Funktionen zu definieren, die dann in HQL verwendet werden können. Siehe hier: Oracle9Dialect.java


btw: Hast du das Performanceproblem schon lösen können?

ms


----------



## y0dA (26. Nov 2007)

ms hat gesagt.:
			
		

> Gut, dann ganz einfach 2 Klassen, die jeweils die genannten Attribute hat und eine many-to-one Definition im mapping der Kindklasse und eine Collection-Definition nach Wahl im mapping in der Elternklasse.
> 
> Siehe dazu auch hier: http://www.hibernate.org/hib_docs/reference/en/html/associations.html
> 
> ...



Ich arbeite grad an dem Performanceproblem  (diesbezüglich antworte ich dann im entsprechenden Thread).

Also ich brauche nun 2 mapping dateien und 2 Klassen - eine für Feature und eine für Feature_Interconnection?
Elternklasse ist feature?
Kindklasse ist Feature_Interconnection?
<many-to-one> schreibe ich dann in das Eltern- oder Kindmapping?
Wie sieht dann das Objekt aus, dass ich zurückbekomme beim ausführen des Stmts?


----------



## ms (26. Nov 2007)

y0dA hat gesagt.:
			
		

> Also ich brauche nun 2 mapping dateien und 2 Klassen - eine für Feature und eine für Feature_Interconnection?


Ja



			
				y0dA hat gesagt.:
			
		

> Elternklasse ist feature?
> Kindklasse ist Feature_Interconnection?


Wenn ein Feature viele Feature_Interconnections haben kann, dann ja, ansonsten eben umgekehrt.



			
				y0dA hat gesagt.:
			
		

> <many-to-one> schreibe ich dann in das Eltern- oder Kindmapping?


In das Kind-Mapping.
Im Elternmapping definierst du am einfachsten eine Collection die dann die Kinder enthalten wird. Siehe dazu Collection Mapping



			
				y0dA hat gesagt.:
			
		

> Wie sieht dann das Objekt aus, dass ich zurückbekomme beim ausführen des Stmts?


Du machst ein SELECT auf das Elternobjekt und in der Collection werden die Kinder mit- bzw. nachgeladen. Je nach dem, ob du lazyloading aktiviert hast.

ms


----------



## y0dA (26. Nov 2007)

ok, es ist eine 1:1 beziehung - irgendwelche änderungen?
wie aktiviere ich lazyloading?

**EDIT**
Die beiden Tabellen stehen ein wenig komisch zu einander:
+) Es gibt eine Fremdschlüsselbeziehunge F_ID = FI_F_ID
--> Es gibt pro F_ID auch nur einen Datensatz in der Feature_Interconnection mit FI_F_ID
+) Jedoch hat die Tabelle Feature_Interconnection einen eigenen Primärschlüssel und benutzt nicht den Fremdschlüssel als PK.


----------



## SnooP (26. Nov 2007)

y0dA hat gesagt.:
			
		

> ok, es ist eine 1:1 beziehung - irgendwelche änderungen?


es gibt zwar auch one-to-one - ist aber nur ne spezielle Form der one-to-many, sprich geht auch beides.



> wie aktiviere ich lazyloading?


Das ist der Standard



> **EDIT**
> Die beiden Tabellen stehen ein wenig komisch zu einander:
> +) Es gibt eine Fremdschlüsselbeziehunge F_ID = FI_F_ID
> --> Es gibt pro F_ID auch nur einen Datensatz in der Feature_Interconnection mit FI_F_ID


find ich jetzt gar nich komisch ... letztlich wie gehabt: trag in der one-to-many beziehung unter column (siehe doku da stehts ganz genau) den foreign-key der "Feature_Interconnection" Tabelle ein... (FI_F_ID)...



> +) Jedoch hat die Tabelle Feature_Interconnection einen eigenen Primärschlüssel und benutzt nicht den Fremdschlüssel als PK.


das macht gar nix  ...


----------



## ms (26. Nov 2007)

y0dA hat gesagt.:
			
		

> ok, es ist eine 1:1 beziehung - irgendwelche änderungen?


Öhm ... ja, da muss dann ein one-to-one im mapping stehen.
Hier ist aber die Eltern-Kind-Beziehung (falls es überhaupt eine gibt) nicht mehr so klar wie bei 1:n.
Es gibt dann natürlich keine Collection von Features mehr, sondern nur mehr ein Feature.

Siehe dazu hier: http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-declaration-onetoone

Du solltest einen halben bis ganzen Tag ins Lesen der Doku investieren. Da ist das wichtigste sehr gut aber kurz erklärt.



			
				y0dA hat gesagt.:
			
		

> wie aktiviere ich lazyloading?


Ab 3.0 ist lazyloading defaultmäßig aktiviert.

Dass es einen eigenen Primärschlüssel gibt ist ok.

ms


----------



## y0dA (26. Nov 2007)

ok, leider steh ich heute extremst auf der Leitung, also hier meine 2 hbm files:

feature hbm, welche das objekt feature_interconnection bekommen soll. Was muss ich hier angeben, eine Collection (es wird ja nur 1 Objekt gefunden werden), wie adde ich die Collection?

```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="at.pcd.wam.technologie.persistence.model">
	<class name="at.pcd.wam.technologie.persistence.model.FeatureModel"
		table="FEATURE">

		
		<id name="id" type="integer" column="F_ID">
		<generator class="assigned" />
		</id>
	
		<property name="dataSupplierSourceId" type="integer" column="F_DSS_ID" />
		<property name="featureTypeId" type="integer" column="F_FT_ID" />
		<property name="geom" type="at.pcd.wam.technologie.persistence.custom.type.JGeometryType" column="F_GEOM" />
		<property name="insert" type="timestamp" column="F_INSERT" />
		<property name="intersectionId" type="integer" column="F_INTERSECTION_ID" />
		<property name="name" type="string" column="F_NAME" />
		<property name="update" type="timestamp" column="F_UPDATE" />

	</class>
</hibernate-mapping>
```

die "kindklasse":

```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="at.pcd.wam.technologie.persistence.model">
	<class name="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel"
		table="FEATURE_INTERCONNECTION">

		
		<id name="id" type="integer" column="FI_ID">
		<generator class="assigned" />
		</id>

		<many-to-one name="featureId" class="at.pcd.wam.technologie.persistence.model.FeatureModel"
			column="FI_F_ID" unique="true"/>

		<property name="featureFrom" type="integer" column="FI_F_FEATURE_FROM" />
		
		<property name="featureInterconnectionTypeId" type="integer" column="FI_FIT_ID" />
		<property name="featureTo" type="integer" column="FI_F_FEATURE_TO" />
		<property name="length" type="float" column="FI_LENGTH" />
		<property name="lengthUnit" type="string" column="FI_LENGTH_UNIT" />

	</class>
</hibernate-mapping>
```

**EDIT**
Also wird nun nur mehr in eines der beiden hbm files eine one-to-one eingetragen? leider habe ich keine zeit zum doku lesen (unter der woche zumindest - habs immo sehr stressig).

Sollte wohl dies umsetzen?:

```
Alternatively, a foreign key with a unique constraint, from Employee to Person, may be expressed as: 

<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
And this association may be made bidirectional by adding the following to the Person mapping: 

<one-to-one name"employee" class="Employee" property-ref="person"/>
```

**EDIT**
Dürfte es nun geschafft haben -.-

-->

```
<one-to-one name="fInterconModel" class="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel"
			property-ref="featureId"/>
```
und das trage ich in die featuremodel hbm ein.

danke euch.


----------



## ms (26. Nov 2007)

Kind-Mapping sollte so bleiben wie es ist.
Im Elternmapping steht dann

```
<one-to-one name="feature_interconnection" class="at.pcd.....Feature_interconnection"
         column="FI_F_ID" property-ref="f_id"/>
```

Wenn auch Datensätze angelegt bzw. gelöscht werden sollen, müssen die cascadings gesetzt werden.

ms


----------



## y0dA (26. Nov 2007)

ms hat gesagt.:
			
		

> Kind-Mapping sollte so bleiben wie es ist.
> Im Elternmapping steht dann
> 
> ```
> ...



reicht es nicht, wenn ich nur folgendes in das featuremodel hbm schreibe:

```
<one-to-one name="fInterconModel" class="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel"
			property-ref="featureId"/>
```

zumindest funktioniert es so bei mir, sprich ich habe nur in ein hbm file die beziehung bekannt gegeben.


----------



## SnooP (26. Nov 2007)

das geht aber auch nur dann, wenn du die featureID also den Foreignkey als tatsächliches Attribut in deiner Entity hast... was eigentlich blöd ist, weil ein solcher Key eigentlich keine weitere Information in dein Objekt bringt sondern eher eine Verknüpfungsinfo für die DB ist... - und genau das kann dir hibernate an der stelle abnehmen, er stellt die Beziehung via column genau so eher, ohne dass du den Foreignkey noch zusätzlich in deiner FeatureInterconnection drinne haben musst.

zum Doku lesen: die ist eigentlich im singe-document so aufgebaut, dass man mit einigen Schlüsselwörtern prima die richtigen Informatinonen zeitnah rausziehen kann... das geht imho schneller als die Informationen aus dem Forum zu ziehen, auch wenn wir dir natürlich gerne helfen  ... sind ja schon interessantere Themen als NoClassDefFound


----------



## y0dA (26. Nov 2007)

SnooP hat gesagt.:
			
		

> das geht aber auch nur dann, wenn du die featureID also den Foreignkey als tatsächliches Attribut in deiner Entity hast... was eigentlich blöd ist, weil ein solcher Key eigentlich keine weitere Information in dein Objekt bringt sondern eher eine Verknüpfungsinfo für die DB ist... - und genau das kann dir hibernate an der stelle abnehmen, er stellt die Beziehung via column genau so eher, ohne dass du den Foreignkey noch zusätzlich in deiner FeatureInterconnection drinne haben musst.
> 
> zum Doku lesen: die ist eigentlich im singe-document so aufgebaut, dass man mit einigen Schlüsselwörtern prima die richtigen Informatinonen zeitnah rausziehen kann... das geht imho schneller als die Informationen aus dem Forum zu ziehen, auch wenn wir dir natürlich gerne helfen  ... sind ja schon interessantere Themen als NoClassDefFound



Klingt logisch, klappt bei mir leider nicht.
Also ihr das Kindmapping:

```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="at.pcd.wam.technologie.persistence.model">
	<class name="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel"
		table="FEATURE_INTERCONNECTION">

		
		<id name="id" type="integer" column="FI_ID">
		<generator class="assigned" />
		</id>
		
		<many-to-one name="featureId" class="at.pcd.wam.technologie.persistence.model.FeatureModel" 
         column="FI_F_ID" unique="true"/> 
		
		<property name="featureFrom" type="integer" column="FI_F_FEATURE_FROM" />
		
		<property name="featureInterconnectionTypeId" type="integer" column="FI_FIT_ID" />
		<property name="featureTo" type="integer" column="FI_F_FEATURE_TO" />
		<property name="length" type="float" column="FI_LENGTH" />
		<property name="lengthUnit" type="string" column="FI_LENGTH_UNIT" />

	</class>
</hibernate-mapping>
```
Wenn ich nun teste ob alles klappt bekomme ich folgenden Fehler:

```
org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel.featureId
	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
	at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
	at org.hibernate.loader.Loader.doQuery(Loader.java:729)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
	at org.hibernate.loader.entity.EntityLoader.loadByUniqueKey(EntityLoader.java:85)
	at org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:1645)
	at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:608)
	at org.hibernate.type.EntityType.resolve(EntityType.java:382)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
	at org.hibernate.loader.Loader.doQuery(Loader.java:729)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2220)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
	at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:811)
	at at.pcd.wam.technologie.batch.Duummmy.main(Duummmy.java:25)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42)
	... 27 more
```

Weiters meintest du ja, dass ich die Fremdschlüsselbeziehung nicht mehr im meinem Model haben muss, weil Hibernate mir das abnimmt, wenn ich aber das Objekt und GETTER/SETTER des Objekts wegnehme schreit Hibernate folgendes:

```
Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find a getter for featureId in class at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel
	at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)
	at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)
	at org.hibernate.mapping.Property.getGetter(Property.java:272)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:247)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:125)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
	at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:295)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
	at at.pcd.wam.technologie.utility.hibernate.HibernateUtil.getSessionFactory(HibernateUtil.java:58)
	at at.pcd.wam.technologie.utility.hibernate.HibernateUtil.getCurrentSession(HibernateUtil.java:69)
	at at.pcd.wam.technologie.batch.Duummmy.main(Duummmy.java:18)
```


----------



## ms (26. Nov 2007)

Besteht das Problem noch immer?
Weil du hast ein paar mal deine Beiträge weiter oben editiert.

ms


----------



## SnooP (26. Nov 2007)

Ich komm auch nich mehr ganz mit wann und mit welcher Konstellation jetzt welcher Fehler existiert


----------



## y0dA (27. Nov 2007)

Fein dass ihr beide mich noch nicht aufgebt , also nochmal:

FeatureModel, welches ein Objekt vom Typ Feature_Interconnection besitzt:

```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="at.pcd.wam.technologie.persistence.model">
	<class name="at.pcd.wam.technologie.persistence.model.FeatureModel"
		table="FEATURE">

		
		<id name="id" type="integer" column="F_ID">
		<generator class="assigned" />
		</id>
	
		
		<one-to-one name="fInterconModel" class="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel"
			property-ref="featureId"/>
	
		<property name="dataSupplierSourceId" type="integer" column="F_DSS_ID" />
		<property name="featureTypeId" type="integer" column="F_FT_ID" />
		<property name="geom" type="at.pcd.wam.technologie.persistence.custom.type.JGeometryType" column="F_GEOM" />
		<property name="insert" type="timestamp" column="F_INSERT" />
		<property name="intersectionId" type="integer" column="F_INTERSECTION_ID" />
		<property name="name" type="string" column="F_NAME" />
		<property name="update" type="timestamp" column="F_UPDATE" />

	</class>
</hibernate-mapping>
```

Feature_Interconnection, in welchem ich mir den FK ersparen soll, da das Hibernate angeblich kann:

```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="at.pcd.wam.technologie.persistence.model">
	<class name="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel"
		table="FEATURE_INTERCONNECTION">

		
		<id name="id" type="integer" column="FI_ID">
		<generator class="assigned" />
		</id>
		
		<many-to-one name="featureId" class="at.pcd.wam.technologie.persistence.model.FeatureModel" 
         column="FI_F_ID" />
		
		<property name="featureFrom" type="integer" column="FI_F_FEATURE_FROM" />
		
		<property name="featureInterconnectionTypeId" type="integer" column="FI_FIT_ID" />
		<property name="featureTo" type="integer" column="FI_F_FEATURE_TO" />
		<property name="length" type="float" column="FI_LENGTH" />
		<property name="lengthUnit" type="string" column="FI_LENGTH_UNIT" />

	</class>
</hibernate-mapping>
```

Wenn ich nun in der Feature_Interconnection kein "many-to-one" schreibe klappt alles, wenn es aber im hbm file steht bekomme ich folgende exception:

```
org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel.featureId
	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
	at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
	at org.hibernate.loader.Loader.doQuery(Loader.java:729)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
	at org.hibernate.loader.entity.EntityLoader.loadByUniqueKey(EntityLoader.java:85)
	at org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:1645)
	at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:608)
	at org.hibernate.type.EntityType.resolve(EntityType.java:382)
	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
	at org.hibernate.loader.Loader.doQuery(Loader.java:729)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2220)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
	at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:811)
	at at.pcd.wam.technologie.batch.Duummmy.main(Duummmy.java:25)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42)
	... 27 more
```

Wenns hilft, hier noch die beiden Modelklassen:

```
public class FeatureModel {

	//------------------------------------------------------------------------------------------------------------------
	// FIELDS
	//------------------------------------------------------------------------------------------------------------------
	
	/** feature interconnnection model */
	private FeatureInterconnectionModel fInterconModel;
	
	/** feature id */
	private Integer id;
	
	/** feature name */
	private String name;
	
	/** feature geometry */
	private JGeometryType geom;
	
	/** data supplier source id */
	private Integer dataSupplierSourceId;
	
	/** feature type id */
	private Integer featureTypeId;
	
	/** insert timestamp */
	private Timestamp insert;
	
	/** update timestamp */
	private Timestamp update;
	
	/** intersection id */
	private Integer intersectionId;
	
	//------------------------------------------------------------------------------------------------------------------
	// CONSTRUCTOR
	//------------------------------------------------------------------------------------------------------------------

	/**
	 * empty constructor
	 */
	public FeatureModel() {
		//nothing to do
	}
	
	//------------------------------------------------------------------------------------------------------------------
	// HELPER METHODS
	//------------------------------------------------------------------------------------------------------------------
	
	//------------------------------------------------------------------------------------------------------------------
	// GETTER / SETTER
	//------------------------------------------------------------------------------------------------------------------

	/**
	 * getter method
	 * @return data supplier source id
	 */
	public Integer getDataSupplierSourceId() {
		return this.dataSupplierSourceId;
	}

	/**
	 * setter method
	 * @param dataSupplierSourceId data supplier source id
	 */
	public void setDataSupplierSourceId(final Integer dataSupplierSourceId) {
		this.dataSupplierSourceId = dataSupplierSourceId;
	}

	/**
	 * getter method
	 * @return feature type id
	 */
	public Integer getFeatureTypeId() {
		return this.featureTypeId;
	}

	/**
	 * setter method
	 * @param featureTypeId feature type id
	 */
	public void setFeatureTypeId(final Integer featureTypeId) {
		this.featureTypeId = featureTypeId;
	}

	/**
	 * getter method
	 * @return geom
	 */
	public JGeometryType getGeom() {
		return this.geom;
	}

	/**
	 * setter method
	 * @param geom geom
	 */
	public void setGeom(final JGeometryType geom) {
		this.geom = geom;
	}

	/**
	 * getter method
	 * @return id
	 */
	public Integer getId() {
		return this.id;
	}

	/**
	 * setter method
	 * @param id id
	 */
	public void setId(final Integer id) {
		this.id = id;
	}

	/**
	 * getter method
	 * @return insert timestamp
	 */
	public Timestamp getInsert() {
		return this.insert;
	}

	/**
	 * setter method
	 * @param insert insert timestamp
	 */
	public void setInsert(final Timestamp insert) {
		this.insert = insert;
	}

	/**
	 * getter method
	 * @return intersection id
	 */
	public Integer getIntersectionId() {
		return this.intersectionId;
	}

	/**
	 * setter method
	 * @param intersectionId intersection id
	 */
	public void setIntersectionId(final Integer intersectionId) {
		this.intersectionId = intersectionId;
	}

	/**
	 * getter method
	 * @return name
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * setter method
 	 * @param name name
	 */
	public void setName(final String name) {
		this.name = name;
	}

	/**
	 * getter method
	 * @return update
	 */
	public Timestamp getUpdate() {
		return this.update;
	}

	/**
	 * setter method
	 * @param update update
	 */
	public void setUpdate(final Timestamp update) {
		this.update = update;
	}

	/**
	 * getter method
	 * @return feature interconnection model
	 */
	public FeatureInterconnectionModel getfInterconModel() {
		return this.fInterconModel;
	}

	/**
	 * setter method
	 * @param interconModel feature interconnection model
	 */
	public void setfInterconModel(final FeatureInterconnectionModel interconModel) {
		this.fInterconModel = interconModel;
	}	
}
```


```
public class FeatureInterconnectionModel {

	//------------------------------------------------------------------------------------------------------------------
	// FIELDS
	//------------------------------------------------------------------------------------------------------------------
	
	/** feature interconnection id */
	private Integer id;
	
	/** feature from id */
	private Integer featureFrom;
	
	/** feature to id */
	private Integer featureTo;
	
	/** foreign key - feature id */
	//private Integer featureId;
	
	/** foreign key - feature interconnection type id */
	private Integer featureInterconnectionTypeId;
	
	/** segment length */
	private float length;
	
	/** unit of the segment length */
	private String lengthUnit;
	
	//------------------------------------------------------------------------------------------------------------------
	// CONSTRUCTOR
	//------------------------------------------------------------------------------------------------------------------

	/**
	 * empty constructor
	 */
	public FeatureInterconnectionModel() {
		//nothing to do
	}

	//------------------------------------------------------------------------------------------------------------------
	// HELPER METHODS
	//------------------------------------------------------------------------------------------------------------------
	
	//------------------------------------------------------------------------------------------------------------------
	// GETTER / SETTER
	//------------------------------------------------------------------------------------------------------------------

	/**
	 * getter method
	 * @return feature from id
	 */
	public Integer getFeatureFrom() {
		return this.featureFrom;
	}

	/**
	 * setter method
	 * @param featureFrom feature from id
	 */
	public void setFeatureFrom(final Integer featureFrom) {
		this.featureFrom = featureFrom;
	}

	/**
	 * getter method
	 * @return feature id
	 */
	//public Integer getFeatureId() {
	//	return this.featureId;
	//}

	/**
	 * setter method
	 * @param featureId feature id
	 */
	//public void setFeatureId(final Integer featureId) {
	//	this.featureId = featureId;
	//}

	/**
	 * getter method
	 * @return feature interconnection type id
	 */
	public Integer getFeatureInterconnectionTypeId() {
		return this.featureInterconnectionTypeId;
	}

	/**
	 * setter method
	 * @param featureInterconnectionTypeId feature interconnection type id
	 */
	public void setFeatureInterconnectionTypeId(final Integer featureInterconnectionTypeId) {
		this.featureInterconnectionTypeId = featureInterconnectionTypeId;
	}

	/**
	 * getter method
	 * @return feature to
	 */
	public Integer getFeatureTo() {
		return this.featureTo;
	}

	/**
	 * setter method
	 * @param featureTo feature to
	 */
	public void setFeatureTo(final Integer featureTo) {
		this.featureTo = featureTo;
	}

	/**
	 * getter method
	 * @return id
	 */
	public Integer getId() {
		return this.id;
	}

	/**
	 * setter method
	 * @param id id
	 */
	public void setId(final Integer id) {
		this.id = id;
	}

	/**
	 * getter method
	 * @return length
	 */
	public float getLength() {
		return this.length;
	}

	/**
	 * setter method
	 * @param length length
	 */
	public void setLength(final float length) {
		this.length = length;
	}

	/**
	 * getter method
	 * @return length unit
	 */
	public String getLengthUnit() {
		return this.lengthUnit;
	}

	/**
	 * setter method
	 * @param lengthUnit length unit
	 */
	public void setLengthUnit(final String lengthUnit) {
		this.lengthUnit = lengthUnit;
	}	
}
```


----------



## SnooP (27. Nov 2007)

jo - die many-to-one muss auch raus... du brauchst nur in einer der beiden Klassen die Referenz auf das andere... es sei denn du willst ne bijektive Beziehung haben... bei JPA geht das via mapped-by Attribut, wie das in xml ging, weiß ich nicht (mehr)- dort in der doku nach bijektiv suchen bei den entsprechenden Assoziationen...


----------



## y0dA (27. Nov 2007)

Nun kenne ich mich nicht mehr aus, wurde mir doch gesagt dass die many-to-one da hingehöre:



> Kind-Mapping sollte so bleiben wie es ist.
> Im Elternmapping steht dann
> Code:
> 
> ...


----------



## ms (27. Nov 2007)

y0dA hat gesagt.:
			
		

> Nun kenne ich mich nicht mehr aus, wurde mir doch gesagt dass die many-to-one da hingehöre:


Zumindest steht es so in den hibernate-docs (5.1.11 ganz unten): http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-declaration-onetoone

ms


----------



## y0dA (27. Nov 2007)

Ja nur warum klappt das dann nicht bei meinem Code? Habe die Schritte befolgt bzw die Doku und bekomme die Exception trotzdem.


----------



## ms (27. Nov 2007)

Habs grad getestet.
Das <many-to-one> mapping benötigt in der Klasse FeatureInterconnectionModel natürlich auch das entsprechende Attribut. Also featureId vom Typ FeatureModel + Getter und Setter.

ms


----------



## y0dA (27. Nov 2007)

ms hat gesagt.:
			
		

> Habs grad getestet.
> Das <many-to-one> mapping benötigt in der Klasse FeatureInterconnectionModel natürlich auch das entsprechende Attribut. Also featureId vom Typ FeatureModel + Getter und Setter.
> 
> ms



Also erspare ich mir letztendlich doch nicht ein Attribut in der Modelklasse! Naja es funktioniert nun endlich und ich bedanke mich bei euch beiden.

Man sieht sich sicher in meinem Performance Thread^^.

mfg


----------

