[Hibernate] Mehrere Keys in einem <set>

Status
Nicht offen für weitere Antworten.

poffi

Mitglied
Längere Texte aller persistenten Klassen werden bei meiner Applikation in eine separate Tabelle gefüllt (Daran kann ich leider auch nichts ändern). Das Ganze wird mit einem <set> gemapt.

Als Fremdschlüssel gebe ich die ID des Objektes an, zu welchem die Texte gehören. Da ich nun aber verschiedene Klassen habe, deren Objekte die längeren Texte in diese Tabelle auslagern, brauche ich einen weiteren Key, der die Klasse unterscheidet.

Beim Speichern eines Objektes muss nun also neben der Objekt-Id auch eine Key für den Typ des Objektes (Klasse) abgelegt werden. Beim Lesen dürfen wiederum nur diese Datensätze aus der text-Tabelle gelesen werden, deren Type und Id übereinstimmen.

Wie realisiere ich das im Mapping bzw. kann ich das überhaupt im Mapping so definieren, dass ich beim Lesen und Schreiben keine weiteren Bedingungen brauche?

Bis anhin sieht es so aus, aber hier fehlt noch der zweite Schlüssel?

Code:
<set name="text" cascade="all" lazy="false">
<key update="true">
<column name="OBJECT_ID" sql-type="smallint"/>
</key>
<one-to-many class="***.text" column/>
</set>

Vielen Dank für alle Ideen und Tipps!
 

KSG9|sebastian

Top Contributor
HAE?
Ich raff gar nichts. Aber so wie es sich anhört willst du ein m:n-Mapping ?!

Sowas zum Beispiel:

Code:
public class Person{
  private List<Adresse> adressen;
}
public class Adresse{
  private Lsit<Person> personen;
}

Eine Person hat n Adressen
Eine Adresse hat n Personen

Ist n mieses Beispiel, aber so allgemein passts.

Schau dir mal Hibernate many-to-many Mappings an.


Person.hbm.xml
Code:
<bag name="personen" table="personen_2_adressen" cascade="all" inverse="false">
        	<key column="personen_id"/>
        	<many-to-many column="adressen_id" class="Adresse" />
</bag>


Adresse.hbm.xml
Code:
<bag name="adressen" table="personen_2_adressen" cascade="all" inverse="true">
        	<key column="adressen_id"/>
        	<many-to-many column="personen_id" class="Person" />
</bag>
So würde das Mappiing für oben genannte Klassen aussehen. Natürlich noch Primärschlüssel u.s.w. dazu

Bei m:n-Beziehungen musst du über eine Zwischentabelle gehen, anders geht's bei Relationalen Datenbanken (zumindest nicht "legal");
Für die Zwischentabelle darfst du KEINE Mappingdatei erzeugen.
 

poffi

Mitglied
Danke, aber du hast mich leider nicht ganz richtig verstanden. Ich versuche es nochmals:

Bis anhin hatte ich nur eine Klasse, die mehrere Objekte aus der Klasse "Text" beinhaltete. Ich mapte in dieser Klasse ein „set“, das mehrere "Text"-Objekte enthielt (1:n). Das funktionierte prima!

Nun kommt aber eine weitere Klasse hinzu, die wiederum ein „set“ an "Text"-Objekten enthält (1:n). Würde ich nun im Mapping wieder das gleiche set mappen, käme es zu Konflikten:
Es kann nämlich sein, dass ein Objekt der Klasse "Haus" die selbe Id wie das Objekt der Klasse "Baum" hat. Dann gäbe es in der "Text"-Tabelle pötzlich einen oder mehrere Datensätze mit dem selben Fremdschlüssel. Lese ich nun alle Datensätze des "Haus"-Objekts aus, bekomme ich auch alle Datensätze des "Baum"-Objekts und das sollte nicht so sein.

Um dieses Problem zu verhindern, brauche ich einen weiteren "Key" in der "Text"-Tabelle, der mir Aus-kunft darüber gibt, um was für ein Objekt es sich handelt.

Klar wo mein Problem liegt?
 

KSG9|sebastian

Top Contributor
Ok...hab ich das so richtig verstanden

Code:
public class X{
  private Set baum;
  private Set haus;
}

Wobei beide Sets Objekte vom gleichen Typ enthalten, richtig?
Warum gehst du nicht über eine zweite Tabelle? Alles andere ist doch Pfusch.

Code:
<bag name="haus" table="x_haus" cascade="all"> 
           <key column="x_id"/> 
    ...          
</bag> 

<bag name="baum" table="x_baum" cascade="all"> 
           <key column="x_id"/> 
    ...          
</bag>

Also wenn ich das richtig verstanden hab dann willst du in einem Objekt zwei Sets haben welche vom Typ her dieselben Objekte enthalten. Und das über irgendwelche weiteren Identifier zu machen ist sicher die schlechteste aller Lösungen.
Du hast ja bei jeder 1:n-Beziehung eine zusätzliche Tabelle, ganz egal ob die Objekte vom gleichen Typ sind.
Neue Beziehung = neue Tabelle !

Edit:
Poste mal bite n bisschen Code um das ganze übersichtlicher zu machen.
 

poffi

Mitglied
Du hast ja bei jeder 1:n-Beziehung eine zusätzliche Tabelle, ganz egal ob die Objekte vom gleichen Typ sind.
Das ist doch nur bei m:n-Beziehungen, bei 1:n macht eine weitere Tabelle keinen Sinn?

So sieht es aus:

Code:
public class Sonne{} // objSonId = x

public class Baum{ // objBauId = 4
  private Set sonne;
} 

public class Haus{ // objHauId = 4
  private Set sonne;
}

Tabelle
id, forgeinkey, objkey
x , 4, 1
x , 4, 2


Eine weitere Tabelle, wäre hier natürlich eine Lösung, diese Alternative steht mir aber leider nicht zu Verfügung. Ich kann auch einfach eine weitere Spalte anlegen und das Ganze über hql erledigen, aber das ist auch nicht das, was ich wirklich will.
Wäre cool wenn es eine Lösung gäbe bei der ich mit Criterias und der Load-Methode arbeiten könnte.
 

KSG9|sebastian

Top Contributor
Also für jede 1:n-Beziehung gibt es zwei Tabellen.

Code:
public class Person{
  private List adressen;
}
public class Adresse{

}

Dann haste eine Tabelle Person und eine Tabelle Adresse (mit nem FK auf Person).
Wenn du keine Tabelle anlegen kannst dann musst du wohl oder übel "pfuschen":

Code:
class Sonne{
   // Primary Key
  private Integer sonnenId;

  // Objekt Key
  private Integer objectKey;
}

http://www.hibernate.org/hib_docs/reference/en/html/collections.html
(unter 6.2 WHERE)

Im Mapping von Baum bzw. Baum bei dem Collection-Element (sonne)

Baum.hbm.xml
Code:
...
<set name="sonne" where="object_key=0">..</set>

Sonne.hbm.xml
Code:
...
<set name="sonne" where="object_key=1">..</set>

Das Property "objectKey" musst du halt manuell setzen, das ist aber kein Problem.
Kannst z.B. in der Klasse Sonne bzw. Baum die Set#add Methode überschreiben

Code:
public void add(Object o){
  ((Sonne)o).setObjectKey(0);
  set.add(o);
}
Und bei der anderen Klasse den Objektkey eben auf 1 setzen.
Damit brauchst du keine weiteren Eingriffe, nicht beim laden oder bei sonstigen Dingen.
 

poffi

Mitglied
Vielen Dank, dass sieht nach dem aus, was ich gesucht habe!
Werde mich damit beschäftigen (Kann aber nicht versprechen, dass das der letzte Post war :)).
 

poffi

Mitglied
kein Problem, immer weiter icon_smile.gif
Wenn das so ist, habe ich noch eine Frage ;)

Die Idee mit dem where-Attribut bewährt sich.

In meinem Mappingfile habe ich in der Baum- und Haus-Klasse eine Set an Sonnen. Wenn ich nun aus meinem Mapping über ein Antscript ein DDL erzeuge, werden diese Beziehungen anhand von Forgeinkeys festgelegt. Füge ich nun aber eine Sonne ein, wird geprüft ob der Fremdschlüssel in der Tabelle Baum und Haus vorhanden ist, was keinen Sinn macht.
Entferne ich die Beziehungen im DDL klappt alles wie es sollte. Nun lautet meine Frage: Wie kann ich im Mapping festlegen, das keine Fremdschlüssel gesetzt werden?

Code:
public class Sonne{}

public class Baum{
  private Set sonne;
}

public class Haus{ 
  private Set sonne;
}
 

poffi

Mitglied
Das würd ich gern, aber darf ich nicht, da es sich um firmeninterne Daten handelt. :(

Gemappt werden die beiden Sets so:

Code:
        <set name="sonnen" cascade="all" lazy="false" where="OBJ_KEY=1">
            <key update="true">
				<column name="OBJECT_ID" sql-type="smallint"/>
			</key>
            <one-to-many class="***.Sonne"/>
        </set>

Das erzeugte DDL enthält neben den Tabellendefinitionen folgende Fremdschlüsselvergaben:

Code:
alter table SONNE
    add constraint **************
    foreign key (OBJECT_ID) 
    references HAUS;

alter table SONNE
    add constraint **************
    foreign key (OBJECT_ID) 
    references BAUM;
 

KSG9|sebastian

Top Contributor
Haus.hbm.xml
Code:
<bag name="sonnen" where="..." cascade="all">
     	<key column="baum_id"/>
     	<many-to-one column="sonnen_id" class="Sonne"/>
</bag>
Baum.hbm.xml
Code:
<bag name="sonnen" where="..." cascade="all">
     	<key column="haus_id"/>
     	<many-to-one column="sonnen_id" class="Sonne"/>
</bag>

Kannst mal so versuchen...anstatt n bag eben dein set nehmen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
krgewb Hibernate: Fremdschlüssel wird nicht erzeugt Datenbankprogrammierung 2
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2
T Hibernate Division zweier Summen Datenbankprogrammierung 4
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
F GWT und Hibernate - gwt.dev.Compler not found Datenbankprogrammierung 3
M NestedTransaction- Exception in Hibernate Datenbankprogrammierung 15

Ähnliche Java Themen


Oben