-->
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.  [ 11 posts ] 
Author Message
 Post subject: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Sat Sep 12, 2009 7:20 am 
Beginner
Beginner

Joined: Tue Sep 08, 2009 9:49 am
Posts: 23
Hallo,

ich arbeite erst seit 2 Wochen mit Hibernate und verwende Version 3.2.

Ich habe mehrere Projekte die auf Daten der selben Datenbank zurückgreifen.
Deshalb habe ich mir ein neues Projekt (MyHibernateDataAccess) erstellt, das den Datenbank Zugriff via Hibernate kapselt. Die anderen Projekte können dann die MyHibenrateDataAccess.jar einbinden und die Persistenz Klassen verwenden. Klappt soweit ganz gut.

Jetzt zum Problem/der Frage. In manch einem Projekt wäre es schön die ein oder andere Persistenz Klasse um Methoden zu erweitern (z.B. Überschreiben der ToString() Methode).
Also z.B.:
Code:
class CountryDAO
{
      public Country getCountryById(int ctryid){...}
}

//originale Persistenz Klasse, für die eine XML Mappingdatei vorhanden ist
class Country{...}

//abgeleitete Klasse in neuem Projekt
class UserCountry extends Data.Hibernate.Country
{
      @Override
      public String ToString()
      {
            return "Der User kommt aus " + this.getName();
      }
}


Frage ist nun, was muss man tun um anstatt eines Country Objekts ein UserCountry Objekt von der DAO Klasse zurück zu bekommen, ohne die Mappingdateien komplett neu schreiben zu müssen und ohne etwas an MyHibernateDataAccess ändern zu müssen?


Gruß
Humppa!


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Wed Sep 16, 2009 12:40 pm 
Beginner
Beginner

Joined: Thu Oct 04, 2007 12:22 pm
Posts: 48
Mein Vorschlag wäre:

Zunächst mappst Du die abgeleitete Klasse innerhalb des Mappings der übergeordneten Klasse auf
die gleiche Tabelle - wenn ich es richtig verstanden habe bleiben die Attribute ja gleich und speisen
sich aus der gleichen Tabelle der Datenbank. Um die beiden Entitäten unterscheiden zu können, wirst
Du ihnen einen eigenen entity-name spendieren müssen.

Für die abgeleitete Klasse schreibst Du nun entweder ein komplett eigenes DAO (falls Du CountryDAO
absolut nicht verändern willst) oder - besser - machst CountryDAO generisch, leitest ein weiteres DAO
davon ab (UserCountryDAO) und setzt dessen Typus auf UserCountry. So sparst Du Dir die Neuimplementation.

Das Problem an meiner Lösung wird für Dich aber sein, dass Du an die Mapping-Datei ranmusst. Um das
zu vermeiden, könntest Du versuchen, Annotations einzusetzen, um auf die gleiche Tabelle zu mappen.

Eine andere Möglichkeit sehe ich nicht


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Wed Sep 16, 2009 12:54 pm 
Senior
Senior

Joined: Mon Jul 07, 2008 4:35 pm
Posts: 141
Location: Berlin
Hi,

Serethos hat recht, ein Verändern in MyHibernateAccess wird sich vermutlich nicht vermeiden lassen, weil ein Discriminator nötig sein dürfte um für die Typensicherheit zu sorgen. Den Discriminator muss du für das parent Entity, das das Tabellen-Layout bestimmt, festlegen.

Wenn content based discrimination (siehe http://docs.jboss.org/hibernate/stable/core/reference/en/html/example-mappings.html#example-mappings-content-discrimination möglich ist, dann wirkt sich das nicht auf's Tabellen-Layout aus. Anderfalls wird eine zusätzliche Discriminator-Spalte notwendig.

Auch wenn das vllt. nicht die bevorzugte Option ist - es ist die sauberste und Hibernate macht die Arbeit für dich.

CU
Froestel

_________________
Have you tried turning it off and on again? [Roy]


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Thu Sep 17, 2009 11:43 am 
Beginner
Beginner

Joined: Tue Sep 08, 2009 9:49 am
Posts: 23
Hallo,

vielen Dank für die Hilfe.

Serethos wrote:
wenn ich es richtig verstanden habe bleiben die Attribute ja gleich und speisen sich aus der gleichen Tabelle der Datenbank.

Exakt so ist es. Die neuen Attribute und Methoden der Kind-Klasse sind unabhängig von der Datenbank.

Froestel wrote:
ein Verändern in MyHibernateAccess wird sich vermutlich nicht vermeiden lassen

Da habe ich mich glaube ich zu unpräzise ausgedrückt. Was ich damit gemeint habe ist, daß das MyHibernateAccess Projekt unabhängig von allen Projekten bleiben soll, die MyHibernateAccess benutzen um Daten aus der Datenbank zu lesen. Es sollen also z.B. keine Klassen aus Projekt XY in MyHibernateAccess verwendet werden. Somit sollen also die von den Persistenz Klassen abgeleiteten Klassen nicht mit in das MyHibernateAccess Projekt aufgenommen werden, sondern im Projekt XY verbleiben.


Nach euren Vorschlägen habe ich ein wenig mit Annotations experimentiert.
1. Country Klasse mit Annotations ausgestattet und getestet.
2. Eine UserCountry Klasse erstellt, die von Country erbt.
3. Eine neue Spalte in die Country Tabelle eingefügt: dtype - CHAR - default 'D'
4. UserCountry und Country jeweils mit um die Annotation @DiscriminatorValue("D") erweitert
(dtype ist der Standardname für eine Discriminator Spalte)
5. CountryDAO generisch gemacht (T extends Country)

Soweit funktioniert das.
Das DAO liefert übrigens nurnoch UserCountry Objekte zurück, selbst wenn UserCountry dem DAO garnicht bekannt gemacht wurde, (also quasi ein Country Objekt angefordert wurde).

Werd jetzt noch ein wenig mit den Entity-Beziehungen von Klassen die Abgeleitet wurden herumspielen.

Vielen Dank soweit!

Gruß
Humppa!


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Thu Sep 17, 2009 12:30 pm 
Senior
Senior

Joined: Mon Jul 07, 2008 4:35 pm
Posts: 141
Location: Berlin
Hi HUMPPA,

jetzt versteh ich glaub ich, worauf du hinauswillst. Die Erweiterungen deines Datenmodells liegen in anderen Projekten, die zwar das MyHibernateAccess-Projekt sehen und importieren können aber nicht umgekehrt. Trotzdem muss Hibernate die Entities kennen, sonst beschwert es sich.

Prinzipiell geht das und zwar sowohl mit Mapping Files aber auch mit Annotations.

Ist das ein Eclipse-Projekt?

CU
Froestel

_________________
Have you tried turning it off and on again? [Roy]


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Thu Sep 17, 2009 1:37 pm 
Beginner
Beginner

Joined: Tue Sep 08, 2009 9:49 am
Posts: 23
Hi Froestel,


Froestel wrote:
jetzt versteh ich glaub ich, worauf du hinauswillst. Die Erweiterungen deines Datenmodells liegen in anderen Projekten, die zwar das MyHibernateAccess-Projekt sehen und importieren können aber nicht umgekehrt.


Ganz genau!
Froestel wrote:
Trotzdem muss Hibernate die Entities kennen, sonst beschwert es sich.

Ja das ist mir klar. Ich dachte nur, dass wenn ich ja von einer Entity-Klasse ableite, dass dann das Kind automatisch auch ein Entity ist.

Froestel wrote:
Prinzipiell geht das und zwar sowohl mit Mapping Files aber auch mit Annotations.

Das läßt mich hoffen :-)
Prinzipiell funktioniert das was ich in meinem letzten Beitrag geschrieben habe auch. Aber wenn es da einen noch einfacheren Weg gäbe würde ich das natürlich sehr begrüßen.

Quote:
Ist das ein Eclipse-Projekt?

Es ist ein MyEclipse Projekt http://www.myeclipseide.com/
(Eclipse mit ein paar Plugins).

Gruß
Humppa


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Thu Sep 17, 2009 2:13 pm 
Senior
Senior

Joined: Mon Jul 07, 2008 4:35 pm
Posts: 141
Location: Berlin
Hi HUMPPA,

welches Geschmäckle von Eclipse ist vermutlich egal ;-) .

Folgende Stichworte dürften da helfen Buddy Loading (siehe z.B. http://wiki.eclipse.org/index.php/Context_Class_Loader_Enhancements) und Activator.

CU
Froestel

_________________
Have you tried turning it off and on again? [Roy]


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Fri Sep 18, 2009 8:49 am 
Beginner
Beginner

Joined: Tue Sep 08, 2009 9:49 am
Posts: 23
Hi,
Froestel, Danke nochmal für Deine Hilfe.

Das mit dem Buddy Loading hab ich mir mal zu Gemüte geführt, aber so richtig habe ich das glaube ich noch nicht kapiert.
Soll das darauf hinauslaufen, daß die Applikation (Projekt namens App) dem MyHibernateAccess Projekt sagt, dass es anstatt die MyHibernateAccess.Country Klasse die App.Country Klasse laden soll?

Ich habe zwischenzeitlich eine ganz simple Lösung gefunden, wobei ich mir aber mangels JVM Background Wissen nicht im klaren bin, ob das ein Bug ist oder eine 100%ige Lösung:

Im Projekt MyHibernateAccess
1. Man führt eine neue abstrakte Klasse ein, AbstractCountry
diese implementiert die Entity
Code:
package hibr.country;
public abstract class AbstractCountry
{
    protected Integer countryid;
    ...
}


2. Man erstellt eine leere Klasse Country die von AbstractCountry erbt
Code:
package hibr.country;
public class Country extends AbstractCountry{}


3. Man erstellt ein DAO, dass hibr.country.Country Objekte persistieren kann.

4. Mappingdatei:
Code:
...
<class name="hibr.country.Country"  table="country" lazy="true">
...


Im Projekt App
3. Man erstellt ebenfalls eine Klasse Country im exakt selben package das auch von AbstractCountry erbt. Diese Klasse kann dann noch beliebig erweitert werden.
Code:
package hibr.country;
public class Country extends AbstractCountry
{
   @Override
   public String toString()
   {
      return this.HUMPPAAA();
   }
   
   
   public String HUMPPAAA()
   {
      return "Humppakäräjät!!";
   }
}


Hier ein code zum Testen
Code:
...
   public static void main(String[] args)
   {
      CountryDAO ctrydao = new CountryDAO();
      List<Country> ctries = ctrydao.findAll();
      String humppa = ctries.get(0).HUMPPAAA();
   }
...


Humppa enthält nach dem Ausführen den Text "Humppakäräjät!!". Es wurde also von der JVM die App.hibr.country.Country Klasse geladen und nicht die aus MyHibernateAccess.
Gibt es eine Regel wann bei mehrfach vorhandenen Klassen welche Klasse ausgewählt wird, oder ist das willkürlich und kann sich z.B. beim nächsten JAVA Update wieder ändern?

Gruß
Humppa!


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Fri Sep 18, 2009 10:09 am 
Beginner
Beginner

Joined: Tue Sep 08, 2009 9:49 am
Posts: 23
Quote:
Gibt es eine Regel wann bei mehrfach vorhandenen Klassen welche Klasse ausgewählt wird, oder ist das willkürlich und kann sich z.B. beim nächsten JAVA Update wieder ändern?


Habe herausgefunden, dass die Build-Reihenfolge der Projekte bestimmt welche Klasse bei Dubletten übernommen wird. Das App Projekt muß in der Build-Reihenfolge (in Eclipse unter dem Punkt "Order-and-Export" zu finden) vor dem MyHibernateAccess Projekt stehen.


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Fri Sep 18, 2009 6:24 pm 
Senior
Senior

Joined: Mon Jul 07, 2008 4:35 pm
Posts: 141
Location: Berlin
Hi HUMPPA,

das, was du das so schreibst, sieht nicht wirklich sauber aus. Auch wenn es vllt für dieses Problem funktioniert, ist zu erwarten, dass dir das irgendwann um die Ohren fliegt. Sich auf eventuelle Bugs zu verlassen, ist nicht gerade die vernünftige Wahl.

Buddy Loading ist definitiv nicht so einfach zu verstehen - ich hab das selber auch nicht drauf. Wir haben das in einem Projekt verwendet. Dabei ist die Hibernate-Anbindung Teil des Application Core. Wir haben unser Datenmodell so flexibel gestaltet, dass es auch Extensions erweitern können. Diese Extensions liegen in eigenen Projekten, nicht nur in anderen Paketen. So lange alles im Core-Projekt liegt, ist es für Hibernate kein Problem damit umzugehen, weil die benötigte Sichtbarkeit da ist. Entities aus anderen Projekten müssen Hibernate aber bekannt gemacht werden.

Wenn du also alles in einem Projekt hast (das können unterschiedliche Pakete darin sein), dann spielt Buddy Loading für dich keine Rolle.

Ansonsten die Empfehlung - mach die Arbeit sauber und verlass dich nicht auf Schlupflöcher! Hibernate kriegt erstaunlich viel gebacken, aber es dauert seine Zeit, bis man die vielen Feinheiten im Griff hat. Dafür muss man einiges lesen und viel ausprobieren.

CU
Froestel

_________________
Have you tried turning it off and on again? [Roy]


Top
 Profile  
 
 Post subject: Re: Architektur Frage bezüglich Mapping abgeleiteter Objekte
PostPosted: Wed Sep 23, 2009 3:23 pm 
Beginner
Beginner

Joined: Tue Sep 08, 2009 9:49 am
Posts: 23
Hi Froestel,

ich will selbstverständlich auch nicht irgendwelche Bugs ausnutzen, weil wenn die dann eines Tages gefixt werden, hat man ein Problem. Deshalb auch die Frage ob es denn einer ist.

Ein Entwickler der MyEclipse IDE hat mir mittlerweile aber bestätigt, dass es kein Bug ist und somit verlässlich verwendet werden kann.

Hier der Link mit genauer Erklärung
http://www.myeclipseide.com/index.php?name=PNphpBB2&file=viewtopic&p=110451#110451

Vielen Dank für Deine Hilfe jedenfalls!

Gruß
Humppa


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