-->
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.  [ 7 posts ] 
Author Message
 Post subject: Parent/Child-Beziehung über mehrere Datenbanken hinweg
PostPosted: Thu Nov 02, 2006 9:58 am 
Newbie

Joined: Fri Oct 20, 2006 5:06 am
Posts: 7
Hallo!

Ich muss eine Abfrage über mehrere Datenbanken machen. Das ganze sieht konzeptionell im Moment so aus:

DB1 enthält Meta-Informationen, d. h. dort sind Datenbanken aufgelistet. Die Tabelle, um die es geht, heißt "ExtCorpDBs" und hat die (relevanten) Felder "Id" und "DbName".

Folgendes Mapping gehört dazu und funktioniert so weit auch:

<hibernate-mapping>
<class name="ExtendedCorpus" table="ExtCorpDBs">
<id name="id" type="int" column="Id">
<generator class="increment" />
</id>
<property name="dbName" column="DbName" type="string" />
</class>
</hibernate-mapping>

Nun verweist jeder Eintrag dann auf eine andere Datenbank (die eben den in DbName angegebenen Namen hat). In dieser (DB2) sind dann weitere Tabellen, von denen ich zunächst eine auslesen muss. Sie heißt "Sentences", enthält aber erst einmal eine Reihe von Ids. Wie bekomme ich es also nun hin, dass mein ExtCorp-Objekt dann eine Liste (Set/Vector/... was auch immer) von Elementen (also eine Liste von Sentence-Objekten) aus der zweiten Datenbank hat?

Nun könnte ich mir vorstellen, statt eines Strings "dbName" ein Objekt "SentenceList" anzulegen. Aber wie fülle ich es und, vor allem, wie binde ich es an? Mir ist auch klar, dass ich für das Auslesen aus unterschiedlichen Datenbanken wohl mit unterschiedlichen Konfigurationen arbeiten muss -- dafür habe ich mir eine zusätzliche SessionFactory gebastelt. Im Moment sehe ich aber nicht den Weg, die Objekte aus der einen DB als Kinder an Objekte aus der anderen zu hängen.

Könnt ihr mir da Hinweise geben?

Vielen Dank.

Johannes


Top
 Profile  
 
 Post subject: Cross-DB-Queries revisited
PostPosted: Tue Nov 07, 2006 8:34 am 
Newbie

Joined: Fri Oct 20, 2006 5:06 am
Posts: 7
Hallo nochmal!

Das ganze scheint doch komplizierter zu sein, als ich bisher gedacht habe. Vielleicht formuliere ich mein Problem noch einmal um:

Ich habe ein (gemapptes, funktionierendes) Objekt namens "ExtCorp". Dieses hat eine Sammlung (im Moment: ein Set) von Sentence-Objekten, die aber in einer anderen Datenbank stehen. Die Datenbank ist im Attribug "dbName" in ExtCorp vorhanden.

Meine Frage: Wie muss mein Mapping aussehen, damit die Sätze aus der anderen Datenbank geladen werden?

Sinngemäß schwebt mir ungefähr das unten stehende Mapping vor. Aber ich habe keine Idee, was als "table" einzutragen ist, da sich die Tabelle ja in einer anderen Datenbank befindet als die Tabelle "ExtCorpDBs".

Code:
<hibernate-mapping>
   <class name="ExtendedCorpus" table="ExtCorpDBs">
      <id name="id" type="int" column="Id">
         <generator class="increment" />
      </id>
      <property name="name" column="Name" type="string" />
      <property name="dbName" column="DbName" type="string" />
      <set name="sentences" table="???">
         <key column="sentenceId" />
         <many-to-many column="sentenceId" class="Sentence" />
      </set>
   </class>
</hibernate-mapping>

Irgendwelche Ideen?

Johannes


Top
 Profile  
 
 Post subject:
PostPosted: Tue Nov 07, 2006 3:22 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Wie Du erkannst hast, brauchst Du 2 Sessions.

Ich könnte mir zwei Lösungen vorstellen.

a)
Ein erweitertes DAO baut die Sachen zusammen. und kümmert sich darum, dass die Einträge in die jeweils richtige DB geschrieben werden.
-Lese aus DB1 und DB2
-setze db1Objekt.setListe(db2Objekte)
...
b)
Baue das irgendwie in Hibernate ein (eigenen Proxy, spezielle Session, Transactionhandling, ...)
c)
versuche vielleicht die Daten in der gleichen DB aber in zwei Schemen zu halten.

Ich würde b nicht ausprobieren.

_________________
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  
 
 Post subject:
PostPosted: Fri Nov 17, 2006 9:24 am 
Newbie

Joined: Fri Oct 20, 2006 5:06 am
Posts: 7
Nun, es hat mich einige Zeit gekostet, aber ich denke, dass ich es jetzt (fast) habe. Ich habe im Grunde den ersten Weg gewählt, mir also ein erstes Objekt erstellt und dann die aus dem zweiten reingeladen. Es läuft theoretisch schon, aber ich habe noch ein ClassCast-Problem. Werde noch etwas in der Hibernate-Doku blättern müssen.

Danke!

Johannes


Top
 Profile  
 
 Post subject: über Datenbakgrenzen hinweg
PostPosted: Wed Nov 29, 2006 7:08 am 
Beginner
Beginner

Joined: Thu Nov 23, 2006 5:09 am
Posts: 21
Ich muss gestehen der totale DB2 Honk zu sein.

Aber es wird doch wohl sowas wie Links etc. geben?!

Vielleicht ist es schöner die remote liegenden Daten der childs via Link und Synonym in die DB der parents zu projezieren?!

Dann wäre es für die Anwendung transparent?!


Top
 Profile  
 
 Post subject:
PostPosted: Wed Nov 29, 2006 7:38 am 
Newbie

Joined: Fri Oct 20, 2006 5:06 am
Posts: 7
Äh ... jetzt erwischst du mich auf dem falschen Fuß ... Links, Synonyme? Auf jeden Fall habe ich den Eindruck du würdest denken, es handele sich um eine DB2-Datenbank von IBM ... das ist nicht der Fall. Es ist MySQL. Mit DB1 und DB2 meinte ich nur die beiden betroffenen Datenbanken im Sinne von "erste Datenbank" und "zweite Datenbank", unabhängig vom Typ.

Auf jeden Fall habe ich es jetzt so gelöst, dass ich in meiner load-Methode eine weitere Methode aufruft, die die entsprechenden Dinge nachlädt. Ich hatte halt gehofft, das nach so einer Art "cascading" über die Konfiguration vollkommen Hibernate überlassen zu können. Aber so geht's auch.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Nov 29, 2006 9:11 am 
Beginner
Beginner

Joined: Thu Nov 23, 2006 5:09 am
Posts: 21
Ok.

Ich hab die letzten Jahre Hauptsächlich ORACLE Datenbanken gemacht.

Dort und bei den meisten anderen kommerziellen DBs kannst Du 2 Instanzen mittels eines Link verbinden.
Der Link ist sowas wie ne dauerhafter Login von DB1 auf DB2.


Damit sind dann die Objekte der Remote DB in der Lokalen zu sehen und man kann darauf zugreifen (Rechte für den User der zum Anlegen verwendet wird vorrausgesetzt).

Allerdings ist die Notation ein wenig sperrig:

schema.object@linkname

In ORACLE gibst Du dann einfach den Objekten Synonyme(Alias) und schwups:

Ein "SELECT * FROM lager" kann auch in der DB1 aufgerufen werden. Selbst wenn 'lager' auf DB2 liegt und in einem vollkommen fremden Schema.

Ich nutze auch Hibernate, aber gerade bei solchen strukturellen Problemen frage ich mich, ob da die Lösung in der DB nicht einfacher ist, oder z.B. sehr komplexe Joins die nur in Abfragen verwendet werden erst in der DB als Views implementieren.


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