Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle

G

Guuustav

Gast
Hallo,
ich habe folgendes Datenbankschema (Tabellen Inhalte sind fiktiv für das Beispiel):

Nutzer
- Nutzer-ID
- Name
- ...

Nutzer-Daten
- Nutzer-ID
- Daten-ID


Jeder Nutzer kann verschiedene Daten-IDs haben, jede Daten-ID kann aber auch von mehreren Nutzern genutzt werden, also eine M:N-Beziehung.

Ok, im allgemeinen kein Problem dies zu modellieren, wenn es noch eine Daten-Tabelle gibt.
Die Daten-IDs sind aber in keiner extra Tabelle gehalten, da in der Datenbank keine weiteren Informationen vorliegen und sie von einem Programm generiert und später auch wieder weiter verarbeitet werden.

Wie kann ich dies modellieren?

In der Art würde ich es mir vorstellen:
Java:
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="Nutzer-Daten",
		   joinColumns = {@JoinColumn(name = "Nutzer-ID")},
		   inverseJoinColumns = {@JoinColumn(name = "Daten-ID")})
public List<Integer> getDaten()
{
	return daten;
}

So dass er dann einfach die Integer die er in daten gespeichert hat als Inhalt für Daten-ID nimmt.

Wie zu erwarten kommt:
Use of @ManyToMany targeting an unmapped class: ....daten[java.lang.Integer]

Wie kann ich dies so modellieren, dass es geht?

Danke für die Hilfe
 

bERt0r

Top Contributor
Wenn die DatenIds nicht näher beschrieben sind in der Datenbank - also in einer eigenen Tabelle DatenIds - macht es auch keinen Sinn eine Relation darauf einzurichten. Wenn sie nur in der einen Tabelle neben den NutzerIds gespeichert werden, sind sie einfach ein Attribut.
 
N

nillehammer

Gast
Das, was bERt0r geschrieben hat, stimmt. Wenn es keine extra Tabelle gibt, ist es keine Relation sondern ein Attribut. Um dieses in eine Spalte der Tabelle zu mappen sehe ich zwei Möglichkeiten:
- Nutze eine ArrayList von Integers. In dem Fall auch wirklich den Typ so definieren und nicht List. Die JPA-Implementierung erkennt ArrayList als Serializable und mappt das in eine BLOB-Spalte der Tabelle. Ist nur doof, weil erstens nur JAVA-Clients was mit diesen Binärdaten anfangen können und zweitens man in der Spalte nur binären Kauderwelsch sieht.
- Nutze eine Spalte vom Typ Array(int). Dafür brauchst Du dann aber einen Custom Usertype. Ist also etwas mehr Aufwand aber wenigstens sieht man die Daten in der Tabelle und auch non-Java Clients haben wenigstens die Chance, die Daten zu verarbeiten.
 
N

nillehammer

Gast
Warte mal. Ich hab mir den Code nochmal näher angeschaut. Ich glaube, was Du suchst ist einfach @ElementCollection.
 
G

Guuustav

Gast
Hallo,
Danke für die Antworten.

Dass hier m:n-Beziehung nicht das richtige Werkzeug ist, habe ich mittlerweile auch bemerkt. War zu sehr in der Denkweise dieses Schemas (da es irgend wo schon noch eine andere Seite gibt und zu dir ist es eine m:n Beziehung. Aber nicht in dem was ich abbilden will).

Über Elementcollection habe ich gelesen:
The JPA 2.0 specification does not provide a way to define the Id in the Embeddable. However, to delete or update a element of the ElementCollection mapping, some unique key is normally required. Otherwise, on every update the JPA provider would need to delete everything from the CollectionTable for the Entity, and then insert the values back. So, the JPA provider will most likely assume that the combination of all of the fields in the Embeddable are unique, in combination with the foreign key (JoinColunm(s)). This however could be inefficient, or just not feasible if the Embeddable is big, or complex.

Deshalb habe ich mich nun für eine bidirektionale 1:n-Beziehung entschieden.

Das einzige was ich an der Lösung nun doof finde ist, dass die Nutzer-Tabelle eine zusätzliche Spalte bekommen hat, die ich mit @Id in der Java-Klasse für die Entity betiteln konnte.

d.h.:
Nutzer-Daten
- ID
- Nutzer-ID
- Daten-ID

Im Prinzip würde Nutzer-ID und Daten-ID zusammen auch einen Primärschlüssel geben aber ich habe nicht gefunden, wie ich das mit Hibernate modelieren kann. Ohne eine @Id Spalte wurden immer Exceptions geworfen.
 
N

nillehammer

Gast
Ich denke nach wie vor doch, dass @ElementCollection die richtige Wahl ist. Die NutzerId, DatenId ist für mich keine eigene Entität und sollte auch nicht so modelliert werden. Vielmehr ist es einfach (wie auch Dein Java-Code ganz deutlich macht) eine Liste(die Collection) von Integers (die Elemente) an der Nutzer-Entity. Um den Listen-Index mit zu speichern, ergibt das eine Tabelle mit drei Spalten: NutzerId (der Fremdschlüssel), DatenId (der Element-Wert) und Index (der List-Index). Falls Du darauf verzichten kannst, modelliere es als Set<Integer> oder sogar als SortedSet<Integer>. Dann sparst Du Dir die extra Index-Spalte. Das passt auch besser, da die DatenIds ja nicht mehrfach zugewiesen werden sollen. Damit bist Du auf Java-Seite sauber. Ich meine sogar, dass dann der Unique-Constraint richtig generiert wird.

Aber des Menschen Wille ist sein Himmelreich. Falls Du es also doch anders machen willst. Hier noch der Hinweis, dass man bei Hibernate durchaus die @Id auch über mehrere Felder setzen kann. Die Tatsache, dass Du das musst, und dass es keine weiteren Felder gibt, sollte Dir aber schon zeigen, dass es keine richtige Entität ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
turmaline H2 [Hibernate] @OneToOne-Beziehung Datenbankprogrammierung 5
S Hibernate - N:1 Beziehung Datenbankprogrammierung 8
M Hibernate - Welche Beziehung? Datenbankprogrammierung 3
S Hibernate - spezielle Frage, n zu n Beziehung Datenbankprogrammierung 11
R [Hibernate] 0..1 Beziehung mit XDoclet abbilden Datenbankprogrammierung 3
G Frage zu Hibernate und M:N Beziehung Datenbankprogrammierung 9
Y Hibernate - Mapping der Beziehung zwischen 2 Tabellen Datenbankprogrammierung 2
Y Hibernate - 1:1 Beziehung liefert leeres Objekt Datenbankprogrammierung 19
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 Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
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

Ähnliche Java Themen

Neue Themen


Oben