-->
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.  [ 13 posts ] 
Author Message
 Post subject: Einfaches interface mapping
PostPosted: Wed Dec 28, 2005 10:46 am 
Newbie

Joined: Wed Dec 28, 2005 10:21 am
Posts: 8
Da ich in Buch und Doku nicht zur Lösung gekommen bin, hier meine Problem:

Ich habe ein Interface IMedia, das zur Zeit von den Klassen Buch, Zeitschrift und Website implementiert wird (später werden weitere dazu kommen).

In einer anderen Klasse Information habe ich:
Code:
public class Information {
...
private IMedia source;
...
}


Wie kann ich das korrekt mappen?
Zu beachten: Die implementierenden Klassen können keine Subclasses oder Components von A sein, da sie auch von anderen Klassen meines Programms verwendet werden.
Bitte verweist mich nicht wieder auf die Doku. Die entsprechenden Kapitel kenn' ich inzwischen langsam auswendig, aber weitergebracht hat's mich nicht.

Hibernate version: Hibernate 3


Top
 Profile  
 
 Post subject:
PostPosted: Wed Dec 28, 2005 1:17 pm 
Newbie

Joined: Thu Oct 21, 2004 10:07 am
Posts: 13
entweder Du verwendest "Table per class hierarchy" oder "Table per concrete class" für das Mapping von IMedia etc.

zwischen IMedia und Information besteht noch eine 1:1 Relation.

ficus wrote:
Zu beachten: Die implementierenden Klassen können keine Subclasses oder Components von A sein, da sie auch von anderen Klassen meines Programms verwendet werden.


warum denn nicht?


Top
 Profile  
 
 Post subject: Mapping files
PostPosted: Wed Dec 28, 2005 2:11 pm 
Newbie

Joined: Wed Dec 28, 2005 10:21 am
Posts: 8
tim23 wrote:
entweder Du verwendest "Table per class hierarchy" oder "Table per concrete class" für das Mapping von IMedia etc.

Und wie würden die Mappingfiles für Information, IMedia und z. B. Buch dann jeweils aussehen?

Quote:
zwischen IMedia und Information besteht noch eine 1:1 Relation.

Wieso? Das gleiche Medium kann durchaus in mehreren Informationen verwendet werden.

Quote:
Zu beachten: Die implementierenden Klassen können keine Subclasses oder Components von A sein, da sie auch von anderen Klassen meines Programms verwendet werden.

warum denn nicht?

Eine Component hat keine eigene db-Identität und kann nur innerhalb ihrer Eigner-Klasse verwendet werden. Da meine implementierenden Klassen aber auch von anderen Klassen benutzt werden, ist das für mich nicht brauchbar.


Top
 Profile  
 
 Post subject: Re: Mapping files
PostPosted: Wed Dec 28, 2005 4:06 pm 
Newbie

Joined: Thu Oct 21, 2004 10:07 am
Posts: 13
Quote:
Wieso? Das gleiche Medium kann durchaus in mehreren Informationen verwendet werden.

ja klar, also 1:N

Quote:
Eine Component hat keine eigene db-Identität und kann nur innerhalb ihrer Eigner-Klasse verwendet werden. Da meine implementierenden Klassen aber auch von anderen Klassen benutzt werden, ist das für mich nicht brauchbar.

components haben keine eigene DB-Identität, sublcasses schon.

Code:
<!-- Table per concrete class -->
   <class name="IMedia" table="IMedia">
       <id name="iMediaId" type="long" column="IMedia_ID">
           <generator class="assigned"/>
       </id>
       <property name="name" column="name" />
       ....
   </class> 

    <class name="Buch" table="Buch">
       <id name="buchId" type="int" column="Buch_ID">
          <generator class="assigned"/>
       </id>
       <property name="name" column="name" />
       .....
    </class>
   
   <class name="WebSite" ....
    </class>
    ....

<!-- Inheritance per class hierarchy -->
   <class name="IMedia" table="IMedia" discriminator-value="iMedia">
        <id name="iMediaId" type="long" column="IMedia_ID">
           <generator class="assigned"/>
       </id>
    <discriminator column="medium" type="string"/>
    <property name="name" column="name" />
    ....
    <subclass name="Buch" discriminator-value="buch">
       <property name="name" column="name"/>
    </subclass>
    ....
   </class>


Top
 Profile  
 
 Post subject: Re: Mapping files
PostPosted: Wed Dec 28, 2005 4:22 pm 
Newbie

Joined: Wed Dec 28, 2005 10:21 am
Posts: 8
Da hab' ich aber bei beiden Versionen das Problem, dass ich für IMedia eine Tabelle und eine id angeben muss. Ein Interface hat aber weder das eine noch das andere. Buch, Website etc. haben jeweils eine eigene Tabelle und id, nicht aber das Interface.
Wie löst man das?


Top
 Profile  
 
 Post subject: Re: Mapping files
PostPosted: Thu Dec 29, 2005 5:43 am 
Newbie

Joined: Thu Oct 21, 2004 10:07 am
Posts: 13
- bei Table per concrete class:
nur eine konkrete Klasse bekommt eine eigene Tabelle in der DB.
(das Interface muss also nicht in das Mapping)

- bei Inheritance per class hierarchy:
benutze das Interface als abstrakte Klasse, dann können alle anderen Klassen (Buch etc.) in einer einzigen Tabelle gespeichert werden


Top
 Profile  
 
 Post subject: Re: Mapping files
PostPosted: Thu Dec 29, 2005 7:42 am 
Newbie

Joined: Wed Dec 28, 2005 10:21 am
Posts: 8
tim23 wrote:
- bei Table per concrete class:
nur eine konkrete Klasse bekommt eine eigene Tabelle in der DB.
(das Interface muss also nicht in das Mapping)

Wenn das Interface kein Mapping hat, wie sieht dann das Mapping für meine Klasse "Information" aus? Da gibt es ja schließlich die member variable
Code:
private IMedia source;


- bei Inheritance per class hierarchy:
benutze das Interface als abstrakte Klasse, dann können alle anderen Klassen (Buch etc.) in einer einzigen Tabelle gespeichert werden


Aufgrund der Datenstruktur ist nicht möglich, mein Interface als abstrakte Klasse zu definieren (wäre auch nicht wirklich Sinn der Sache, die Objektkonzepte so zu verbiegen). Fällt also als Lösung weg.


Top
 Profile  
 
 Post subject: Re: Mapping files
PostPosted: Thu Dec 29, 2005 12:53 pm 
Newbie

Joined: Thu Oct 21, 2004 10:07 am
Posts: 13
Nach meiner Meinung nach unterscheidet Hibernate nicht wirklich zwischen Klassen und Interfaces. D.h. man kann alle 3 Strategien verwenden.

Folgender Abschnitt ist aus "Hibernate in Action" (S.101):
Code:
3.6.3 Table per subclass
The third option is to represent inheritance relationships as relational foreign key
associations. Every subclass that declares persistent properties—including abstract
classes and even interfaces —has its own table.
.....


Betonung liegt auf even interfaces ;-)

hast Du eigentlich Dein Mapping schon erstellt oder bist Du noch in der Planungsphase?


Top
 Profile  
 
 Post subject: Re: Mapping files
PostPosted: Thu Dec 29, 2005 2:43 pm 
Newbie

Joined: Wed Dec 28, 2005 10:21 am
Posts: 8
tim23 wrote:
Nach meiner Meinung nach unterscheidet Hibernate nicht wirklich zwischen Klassen und Interfaces. D.h. man kann alle 3 Strategien verwenden.


Hibernate unterscheidet zwar nicht, aber es gibt eben trotzdem Unterschiede, wie z. B. dass ein Interface nun mal keine Tabelle in der db hat. Daher lassen sich die Beispiele für Klassen leider nicht einfach auf Interfaces übertragen.

Quote:
hast Du eigentlich Dein Mapping schon erstellt oder bist Du noch in der Planungsphase?


Für die meisten meiner Klassen sind die Mappings gemacht, aber bei den Interfaces habe ich so meine Probleme. Ich hab' bereits diverse Versuche nach dem Buch probiert, aber nichts funktioniert. Daher ist Hilfe dringend nötig.

Wenn ich in meiner "Information"-Klasse das Ganze als many-to-one-Beziehung mappe, bekomme ich:
Code:
An association from the table tblRezepte refers to an unmapped class: IMedia


Wenn ich IMedia als Klasse mappe, verlangt Hibernate aber die Angabe einer zugehörigen Tabelle, die ein Interface nun mal nicht hat.

Alle implementierenden Klasse in eine Tabelle "tblMedia" speichern ist nicht möglich, da die einzelnen Klassen unabhängig von einander und unabhängig von "Information" existieren und außerdem völllig unterschiedliche Felder haben. Als Beispiel: Für eine Klasse Kontakt, die eine Referenz auf eine Person hält, macht es keinen Sinn, dass die Person in tblMedia gespeichert wird. "Kontakt" interessiert sich nicht für IMedia, sondern einfach nur für "Person", weshalb die Klasse "Person" unabhängig von der Beziehung zu "Information" benutzt werden können muss.

Wenn ich aus dem anderen Buch-Beispiel den any-Tag verwende, gibt es zwar keinen Fehler, aber die media-Referenz wird einfach ignoriert (in die db wird null geschrieben).

Es muss doch eine brauchbare (und den OO-Konzepten entsprechende) Lösung geben!?


Top
 Profile  
 
 Post subject: Korrektur
PostPosted: Thu Dec 29, 2005 2:44 pm 
Newbie

Joined: Wed Dec 28, 2005 10:21 am
Posts: 8
ficus wrote:
tim23 wrote:
Nach meiner Meinung nach unterscheidet Hibernate nicht wirklich zwischen Klassen und Interfaces. D.h. man kann alle 3 Strategien verwenden.


Hibernate unterscheidet zwar nicht, aber es gibt eben trotzdem Unterschiede, wie z. B. dass ein Interface nun mal keine Tabelle in der db hat. Daher lassen sich die Beispiele für Klassen leider nicht einfach auf Interfaces übertragen.

Quote:
hast Du eigentlich Dein Mapping schon erstellt oder bist Du noch in der Planungsphase?


Für die meisten meiner Klassen sind die Mappings gemacht, aber bei den Interfaces habe ich so meine Probleme. Ich hab' bereits diverse Versuche nach dem Buch probiert, aber nichts funktioniert. Daher ist Hilfe dringend nötig.

Wenn ich in meiner "Information"-Klasse das Ganze als many-to-one-Beziehung mappe, bekomme ich:
Code:
An association from the table tblInformation refers to an unmapped class: IMedia


Wenn ich IMedia als Klasse mappe, verlangt Hibernate aber die Angabe einer zugehörigen Tabelle, die ein Interface nun mal nicht hat.

Alle implementierenden Klasse in eine Tabelle "tblMedia" speichern ist nicht möglich, da die einzelnen Klassen unabhängig von einander und unabhängig von "Information" existieren und außerdem völllig unterschiedliche Felder haben. Als Beispiel: Für eine Klasse Kontakt, die eine Referenz auf eine Person hält, macht es keinen Sinn, dass die Person in tblMedia gespeichert wird. "Kontakt" interessiert sich nicht für IMedia, sondern einfach nur für "Person", weshalb die Klasse "Person" unabhängig von der Beziehung zu "Information" benutzt werden können muss.

Wenn ich aus dem anderen Buch-Beispiel den any-Tag verwende, gibt es zwar keinen Fehler, aber die media-Referenz wird einfach ignoriert (in die db wird null geschrieben).

Es muss doch eine brauchbare (und den OO-Konzepten entsprechende) Lösung geben!?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 11, 2006 7:38 am 
Newbie

Joined: Wed Jan 11, 2006 5:15 am
Posts: 15
Was hindert dich daran für dein Interface eine eigene Tabelle herzunehmen?
Das du noch ein ID brauchst?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 11, 2006 4:41 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Table per subclass wird IMHO nur dann funktionieren, wenn Media eine ID hat. Hibernate benötigt ja irgendetwas, um das Objekt zu identifizieren. Wie willst Du sonst
IMedia x = (IMedia) session.get(Zeitschrift.class,5);
// tu was damit
session.save(x);
durchführen. Wie soll Hibernate IMedia Instanzen in der Session identifizieren. Eine ID muss immer vorhanden sein, egal ob Du table per concrete class oder subclass hast.

Deine IMedia muss also eine id haben. Oder Du erstellt noch eine HibernateIMedia, die eine ID hat und die Du für das Mapping verwendest.

Gruß Sebastian

_________________
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: Sun Mar 11, 2007 11:35 am 
Newbie

Joined: Sun Mar 11, 2007 11:31 am
Posts: 4
Wurde das Problem denn inzwischen gelöst? Ich stehe nämlich vor ziemlich dem gleichen Problem und konnte noch keine Lösung finden.

Ich habe ein Rights-Interface welches von den Klassen User und Group implementiert wird. Eine Group hat nun eine List<Rights>, kann also weitere Gruppen oder User beinhalten, User ist immer ein Blattknoten in diesem Baum, kann also keine weiteren User oder Groups aufnehmen. (Das ganze entspricht wohl dem composite pattern).

Gruß,
Ace


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