![]() |
|
|
|||||||
| Datenbankprogrammierung Fragen zur Anbindung und Programmierung von Datenbanken bzw. Datenbankabfragen |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Stammbenutzer
Floppy Disc
Registriert seit: 16.12.2006
Fachbeiträge: 722
Abgegebene Danke: 32
Erhielt 3 Danke für 3 Beiträge
|
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 |
|
|
| #4 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Fachbeiträge: 31.675
Abgegebene Danke: 0
Erhielt 2.570 Danke für 2.531 Beiträge
|
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
__________________
Hansa wird Meister. |
|
|
| #5 (permalink) | |
|
Stammbenutzer
Megabyte
Registriert seit: 11.09.2005
Fachbeiträge: 1.059
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
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.
__________________
"The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence." Edsger W. Dijkstra |
|
|
| #6 (permalink) | ||||||||||||||||
|
Stammbenutzer
Floppy Disc
Themenstarter
Registriert seit: 16.12.2006
Fachbeiträge: 722
Abgegebene Danke: 32
Erhielt 3 Danke für 3 Beiträge
|
Leider ist mir das Datenmodell vorgegeben bzw gehören die beiden Tabellen getrennt.
|
|||||||||||||||
|
|
||||||||||||||||
| #7 (permalink) | |
|
Stammbenutzer
Floppy Disc
Registriert seit: 16.08.2007
Fachbeiträge: 802
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
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 |
|
|
| #8 (permalink) | |
|
Stammbenutzer
Megabyte
Registriert seit: 11.09.2005
Fachbeiträge: 1.059
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
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.
__________________
"The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence." Edsger W. Dijkstra |
|
|
| #9 (permalink) | |
|
Stammbenutzer
Floppy Disc
Themenstarter
Registriert seit: 16.12.2006
Fachbeiträge: 722
Abgegebene Danke: 32
Erhielt 3 Danke für 3 Beiträge
|
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): Code:
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 Also mach ich nun eine many to one oder eine join beziehung in mein mapping? Code:
<?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> |
|
|
| #10 (permalink) | |
|
Stammbenutzer
Megabyte
Registriert seit: 11.09.2005
Fachbeiträge: 1.059
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
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.
__________________
"The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence." Edsger W. Dijkstra |
|
|
| #11 (permalink) | |
|
Stammbenutzer
Floppy Disc
Registriert seit: 16.08.2007
Fachbeiträge: 802
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
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/re...ociations.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 |
|
|
| #12 (permalink) | ||||||||||||||||
|
Stammbenutzer
Floppy Disc
Themenstarter
Registriert seit: 16.12.2006
Fachbeiträge: 722
Abgegebene Danke: 32
Erhielt 3 Danke für 3 Beiträge
|
(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? |
|||||||||||||||
|
|
||||||||||||||||
| #13 (permalink) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Stammbenutzer
Floppy Disc
Registriert seit: 16.08.2007
Fachbeiträge: 802
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
Im Elternmapping definierst du am einfachsten eine Collection die dann die Kinder enthalten wird. Siehe dazu Collection Mapping
ms |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #14 (permalink) | |
|
Stammbenutzer
Floppy Disc
Themenstarter
Registriert seit: 16.12.2006
Fachbeiträge: 722
Abgegebene Danke: 32
Erhielt 3 Danke für 3 Beiträge
|
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. |
|
|
| #15 (permalink) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Stammbenutzer
Megabyte
Registriert seit: 11.09.2005
Fachbeiträge: 1.059
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
...
__________________
"The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence." Edsger W. Dijkstra |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #16 (permalink) | |||||||||||||||||||||||||||||||
|
Stammbenutzer
Floppy Disc
Registriert seit: 16.08.2007
Fachbeiträge: 802
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
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/re...ation-onetoone Du solltest einen halben bis ganzen Tag ins Lesen der Doku investieren. Da ist das wichtigste sehr gut aber kurz erklärt.
Dass es einen eigenen Primärschlüssel gibt ist ok. ms |
||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||
| #17 (permalink) | |
|
Stammbenutzer
Floppy Disc
Themenstarter
Registriert seit: 16.12.2006
Fachbeiträge: 722
Abgegebene Danke: 32
Erhielt 3 Danke für 3 Beiträge
|
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? Code:
<?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> Code:
<?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> 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?: Code:
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"/> Dürfte es nun geschafft haben -.- --> Code:
<one-to-one name="fInterconModel" class="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel" property-ref="featureId"/> danke euch. |
|
|
| #18 (permalink) | |
|
Stammbenutzer
Floppy Disc
Registriert seit: 16.08.2007
Fachbeiträge: 802
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
Kind-Mapping sollte so bleiben wie es ist.
Im Elternmapping steht dann Code:
<one-to-one name="feature_interconnection" class="at.pcd.....Feature_interconnection"
column="FI_F_ID" property-ref="f_id"/>
ms |
|
|
| #19 (permalink) | ||||||||||||||||
|
Stammbenutzer
Floppy Disc
Themenstarter
Registriert seit: 16.12.2006
Fachbeiträge: 722
Abgegebene Danke: 32
Erhielt 3 Danke für 3 Beiträge
|
Code:
<one-to-one name="fInterconModel" class="at.pcd.wam.technologie.persistence.model.FeatureInterconnectionModel" property-ref="featureId"/> |
|||||||||||||||
|
|
||||||||||||||||
| #20 (permalink) | |
|
Stammbenutzer
Megabyte
Registriert seit: 11.09.2005
Fachbeiträge: 1.059
Abgegebene Danke: 0
Erhielt 1 Danke für 1 Beitrag
|
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
__________________
"The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence." Edsger W. Dijkstra |
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Hibernate: Abfrage über 2 Tabellen | pusteblume | Data Tier | 2 | 22.01.2009 12:30 |
| [Hibernate] Constraints über mehrere Tabellen | Java Basics - Anfänger-Themen | 2 | 30.09.2008 14:03 | |
| Hibernate - Mapping der Beziehung zwischen 2 Tabellen | y0dA | Datenbankprogrammierung | 2 | 23.01.2008 11:51 |
| [Hibernate] Alle Objekte laden aus der DB laden | Fenixx | Java Basics - Anfänger-Themen | 6 | 23.08.2007 09:48 |
| Tabellen als XML exportieren mit Hibernate | ZeHa | Datenbankprogrammierung | 0 | 11.12.2006 10:21 |
| Lesezeichen |
|
|