Frage zu Hibernate-Mapping

Verjigorm

Top Contributor
Hallo,
ich versuche mal kurz mein Problem mit Hibernate zu beschreiben. Dazu habe ich für mich persönlich gemerkt, dass ich vermutlich zu wenig Ahnung von Hibernate habe ;)

Habe 2 Tabellen A+B, habe beide Tabellen jede für sich gemappt, funktioniert soweit erstmal wunderbar (Klasse A und Klasse B).
Nun stehen A+B in einer 1:1-Beziehung zueinander und das wurde bisher noch nicht abgebildet.

Tabelle A hat einen einfachen PK, eine id-spalte. Diese habe ich ganz normal als "Long id" gemappt, mit @Id dran.

Tabelle B hat einen FK ref_id, der auf den PK von Tabelle A referenziert.

Diese 2 Spalten wurden vorher als ganz normale Longs abgebildet und händisch verwaltet. Möchte ich nun die Referenz von A -> B abbilden, so würde ja meine id aus Klasse A zu einer Referenz auf Klasse B. Wenn ich als jetzt noch @JoinColumn oder so hinzufüge, dann möchte das Hibernate aber nicht. Erscheint mir auch nicht ganz so logisch. Ich verliere ja so quasi gesehn meine Id.
Ich hab jetzt versucht das irgendwie abzubilden, aber Hibernate möchte keine meiner Lösungen akzeptieren :D Kann mir soweit jemand helfen bei meiner "wirren" Erklärung?
Ansonsten werdeich am Montag mal mein Teststellung posten müssen.

mfg Verjigorm
 

mvitz

Top Contributor
Egal ob du das Mapping per XML oder per Annotationen machst.

Du solltest erst mal deinen Versuch posten ;)

EDIT: Seh gerade, dass du das morgen machst ^^...

Hast du denn auch mit @OneToOne gemapped?
 

Verjigorm

Top Contributor
Ok, ich merke grade, ich verstehe das Hibernate-System nicht wirklich :D

Habe ein Minimalbeispiel gemacht.
Tabelle1 mit nur einer Spalte id (PK)
Tabelle2 mit 2 Spalten:
- id (PK)
- ref_id als FK auf Tabelle1

Das Mapping mit Annotationen habe ist unten. Bedingung sollte auch sein, dass TestMapping1 auf TestMapping2 zugreift, aber nicht umgekehrt.
Ich seh momentan den Wald vor lauter Bäumen nicht. Vielelciht sollte ich was anderes machen ...
Die Hibernateausgabe (gekürzt) sieht momentan wie folgt aus:

Select * from test1 this_ left outer join test2 testmappin2_ on this_.id=testmappin2_.id where this_.id = 5

was ja falsch ist, da sollte doch stehen
select * from test1 this_ left outer join test2 testmappin2_ on this_.id=testmappin2_.ref_id where this_.id = 5

dafür gibt es doch referencedColumnName oder nicht?
und generell passt es doch auch nicht, dass ich in TestMapping1 die Id und die Referenz auf TestMapping2 habe oder?

mfg Verjigorm

Java:
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table (name = "test1")
public class TestMapping1 implements Serializable
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@Column (name = "id")
	private Long id;
	
	@OneToOne (fetch = FetchType.EAGER)
	@JoinColumn (name = "id",  referencedColumnName = "ref_id")
	private TestMapping2 test2;
	/**
	 * @param id the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}
	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}
	/**
	 * @param test2 the test2 to set
	 */
	public void setTest2(TestMapping2 test2) {
		this.test2 = test2;
	}
	/**
	 * @return the test2
	 */
	public TestMapping2 getTest2() {
		return test2;
	}
	
}

Java:
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table (name = "test2")
public class TestMapping2 implements Serializable
{
	/**
	 * 
	 */
	private static final long serialVersionUID = -1495990285243104362L;
	
	@Id
	@Column (name = "id")
	private Long id;
	
	@Column( name = "ref_id")
	private Long ref_id;
	
	/**
	 * @param id the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}
	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}
	/**
	 * @param ref_id the ref_id to set
	 */
	public void setRef_id(Long ref_id) {
		this.ref_id = ref_id;
	}
	/**
	 * @return the ref_id
	 */
	public Long getRef_id() {
		return ref_id;
	}
	
}
 
S

SlaterB

Gast
auf _ in irgendwas auf dieser Welt außer vielleicht statische Konstanten MAX_DATE und ähnliche Großschreibungen etwa von Attributen in DB-Tabellen solltest du verzichten, zumindest fürs Forum

-----

wie ist deine RefId zu verstehen, gibt es eine 1:1-Beziehung oder eine 1:n-Beziehung?
wenn Tabelle2 eine Id auf Tabelle1 hat wäre es natürlicher, eben in der Klasse TestMapping2 auf TestMapping1 zu verweisen statt umgekehrt?,
Hibernate kann allerdings durchaus bidirektional vervollständigen, na hast du ja im Grunde auch, beim Mapping wird nicht gemeckert?


wenn du SQL-Queries baust, dann haben die Hibernate-Klassen und Mappings quasi keine Bedeutung,
in HQL musst du nicht unbedingt mit Ids hantieren, da sollte auch folgendes funktionieren:
Code:
select * from TestMapping1 one inner join one.test2 as two where one.id = 5
die Referenz auf TestMapping2 in TestMapping1 'test2' zu benennen, genau wie die DB-Tabelle, ist nicht gut
 

mvitz

Top Contributor
Ist denn das Schema vorgegeben?

Weil das entspricht ja eigentlich nicht dem normalen OneToOne Mapping.
Da ist nämlich die Spalte, die die Beziehung angibt (bei dir ref_id) wie im Link von tfa zu sehen auf der "Besitzenden"-Seite (die in diesem Fall ja Test1 ist). Bei dir jedoch soll diese in Test2 obwohl du laut deiner Aussage nur von Test1 auf Test2 navigieren willst.

Beim normalen Fall sieht das Schema dann folgendermaßen bei mir aus (H2 Datenbank):

SQL:
create table Test1 (id bigint generated by default as identity, test2_id bigint, primary key (id))
create table Test2 (id bigint generated by default as identity, primary key (id))
alter table Test1 add constraint FK4CF5DBF6D274EFD foreign key (test2_id) references Test2
 

mvitz

Top Contributor
Ansonsten geht das evtl so?

Java:
@Entity
public class Test1 {

    @Id
    @GeneratedValue
    private Long id;
    @OneToOne(mappedBy = "test1", fetch = FetchType.EAGER)
    private Test2 test2;

    public Long getId() {
        return id;
    }
    public void setId(Long aId) {
        id = aId;
    }
    public Test2 getTest2() {
        return test2;
    }
    public void setTest2(Test2 aTest2) {
        test2 = aTest2;
        test2.test1 = this;
    }
}
Java:
@Entity
public class Test2 {

    @Id
    @GeneratedValue
    private Long id;
    @OneToOne
    protected Test1 test1;

    public Long getId() {
        return id;
    }
    public void setId(Long aId) {
        id = aId;
    }
}
 
Zuletzt bearbeitet:

Verjigorm

Top Contributor
Hallo!

Ja, das Schema ist fest und es sind sich alle einig, dass es sch*** ist. Beim nächsten Versionssprung werden diese 2 Tabellen um die es momentan geht, die in einer 1:1-Verbindung zueinander stehen, auch zu einer zusammengefasst. Da die 2 Tabellen momentan auch redundante Daten etc. beinhalten.

Danke schonmal für die Hilfe, ihr habt mir jetzt schonmal soweit weitergeholfen, dass es funktioniert :)

Nun habe ich noch ein kleines weiteres Problem:

Ich mache nun mit Hibernate ein save(test1). test2 soll dabei automatisch mitgespeichert werden.
Momentan mache ich nach dem save(test1) noch ein save(test1.getTest2()) ....
Soweit ich weiss, ist doch cascade dafür verantwortlich oder nicht? Habe nun CascadeType.Persist und CascadeType.ALL versucht, aber beiden will nicht.

Wie mach ich das denn nun?

mfg Verjigorm
 

mvitz

Top Contributor
Wenn ich mich richtig erinnere, dann hängt das Cascade von der Besitzendenseite ab.

Wenn du das jetzt so gelöst hast, wie ich oben gepostet habe, dann ist Test2 die besitzende-Seite und wenn du Test2 speicherst, sollte Test1 mitgespeichert werden.
 

Verjigorm

Top Contributor
Nein, habs andersrum, Test1 ist die Besitzendenseite.
Ich geb da doch auch den FetchType.EAGER an, dann muss das doch auch beim Speichern klappen oder?
 

mvitz

Top Contributor
Eigentlich funktioniert das schon mit dem Kaskadieren. Wie sehen denn aktuell deine Klassen aus?

Anbei mal ein Beispiel von mir (nutze allerdings nicht direkt Hibernate sondern JPA)

Java:
@Entity
public class Test1 {

    @Id
    @GeneratedValue
    private Long id;
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    private Test2 test2;

    public Long getId() {
        return id;
    }
    public void setId(Long aId) {
        id = aId;
    }
    public Test2 getTest2() {
        return test2;
    }
    public void setTest2(Test2 aTest2) {
        test2 = aTest2;
    }
}
Java:
@Entity
public class Test2 {

    @Id
    @GeneratedValue
    private Long id;

    public Long getId() {
        return id;
    }
    public void setId(Long aId) {
        id = aId;
    }
}
Java:
public class Main {
    public static void main(String[] args) {
        EntityManager em = Persistence.createEntityManagerFactory("TEST").createEntityManager();

        Test2 test2 = new Test2();
        Test1 test1 = new Test1();
        test1.setTest2(test2);

        em.getTransaction().begin();
        em.persist(test1);
        em.flush();
        em.getTransaction().commit();

        em.clear();

        Test2 test2new = em.find(Test2.class, 1L);
        System.out.println(test2new.getId());

        Test1 test1new = em.find(Test1.class, 1L);
        System.out.println(test1new.getId());
        System.out.println(test1new.getTest2().getId());
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
R hibernate Frage zu configFile-Pfad und Groß/Kleinschreibung von Postgres-Tabellen Datenbankprogrammierung 8
S Hibernate - spezielle Frage, n zu n Beziehung Datenbankprogrammierung 11
G Frage zu Hibernate und M:N Beziehung Datenbankprogrammierung 9
B Hibernate mit MySql - Verständniss Frage Datenbankprogrammierung 8
M Frage zu Bundesliga-DB Datenbankprogrammierung 1
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
B Frage zu Datenbank Design bei Events (ZenDesk) Datenbankprogrammierung 1
B SQLite Frage zu SQLite Datenbankverbindung Datenbankprogrammierung 7
M Frage zu JSON Datenbankprogrammierung 16
P Frage zu Connection.close() Datenbankprogrammierung 4
R MySQL Frage zum Anlegen von Artikeln inkl. Verbindungen Datenbankprogrammierung 0
M Grundlegende Klassen-Design Frage Datenbankprogrammierung 0
P MySQL Frage zur Einbindung in ein Java Projekt Datenbankprogrammierung 2
I Frage zu Datenmodellierung Datenbankprogrammierung 3
J Normalisierung - Allgemeine Frage zur 3. Normalform (Eventuelle Abhängigkeit) Datenbankprogrammierung 4
F Normalisierung Datenbank Frage Datenbankprogrammierung 5
J Frage zu ResultSet Datenbankprogrammierung 3
W Frage zur Datenbankwahl bei Umstieg auf Java Datenbankprogrammierung 7
D Frage zu DISTINCT in SQL Datenbankprogrammierung 5
K Frage zur Datenprotokollierung bei DML Anweisungen Datenbankprogrammierung 3
K Frage zu SQL Datenbankprogrammierung 2
K Frage zu Datenbankmodellierung Datenbankprogrammierung 15
D Generelle Frage zum Umgang mit Datensätzen Datenbankprogrammierung 5
L Frage zu UpdateQuery Datenbankprogrammierung 12
8 MySQL Kurze Frage zur Sicherheit Datenbankprogrammierung 9
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
D Frage zu Ausführungsmöglichkeiten von SQL Befehlen Datenbankprogrammierung 13
D Frage zu SQL Syntax Datenbankprogrammierung 17
D Frage zu potenziellen Leerzeichen in einer Datenbank Datenbankprogrammierung 5
X Connection schließen oder speichern? Performance Frage Datenbankprogrammierung 7
J mal wieder eine Frage zu parallelen Transaktionen.. Datenbankprogrammierung 2
N Allg. Frage zur Datenbankverbindung Datenbankprogrammierung 2
E einfache Frage bei DB-Zugriff Datenbankprogrammierung 11
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
O eigentlich simple SQL Frage Datenbankprogrammierung 2
M Frage zu folgender Query in EJB-QL Datenbankprogrammierung 4
H JBoss: Frage zur Datasource in der ...-ds.xml Datenbankprogrammierung 4
F Frage zu Prepared Statement Datenbankprogrammierung 2
U Frage zum Erfassen von hinzufügten und entfernten Objekten Datenbankprogrammierung 9
M prinzipielle Frage zu Datenbanken und jars ... Datenbankprogrammierung 2
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
J Frage zu Synchronisation bei parallelem Zugriff, speziell mit JPA Datenbankprogrammierung 2
F EclipseLink persistence.xml Frage Datenbankprogrammierung 11
N Frage zur Sicherheit von Konfigurationsdatei Datenbankprogrammierung 4
H performance frage Datenbankprogrammierung 9
G Frage zum Insert-Statement Datenbankprogrammierung 2
Antoras Design-Frage: Datenzuordnung zu verschiedenen Accounts Datenbankprogrammierung 2
T HSQL: verständnis Frage Datenbankprogrammierung 2
T Java JPA Frage bzgl. DISTINCT Datenbankprogrammierung 2
G Frage zu connection? Datenbankprogrammierung 9
A Frage zu SQL-Abfrage Datenbankprogrammierung 2
G Frage zu SQL "WHERE IN (1, 2, 3. , N)" Datenbankprogrammierung 8
G Allgemeine Frage zu Datenbanklimits Datenbankprogrammierung 27
G allgemeine JDBC-Connection Frage Datenbankprogrammierung 2
K HQL Frage Datenbankprogrammierung 10
D kurze Frage zu einem Query Datenbankprogrammierung 6
N Kleine Frage zu Connection Pooling mit DataSource Datenbankprogrammierung 2
T Update-Frage Datenbankprogrammierung 11
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
P Frage zu Performancetest einer Datenbank Datenbankprogrammierung 3
W Frage zum Umgang mit DB-Daten Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
P frage zu "" bei INSERT STATEMENTS Datenbankprogrammierung 2
K frage zum ausführen eines INSERT statements Datenbankprogrammierung 16
L frage zu mySQL Datenbankprogrammierung 4
C Mal ne Frage an die Experten Datenbankprogrammierung 4
G Frage zum Datenbankdesign Datenbankprogrammierung 5
J DB Verbindung Design Frage Datenbankprogrammierung 5
M Datenbankanbindung in Java : Newbie-Frage Datenbankprogrammierung 2
U Grundsätzliche Frage Datenbankprogrammierung 4
S Frage zu INSERT Datenbankprogrammierung 2
X Wieder mal ne Frage ... Datenbankprogrammierung 15
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

Ähnliche Java Themen

Neue Themen


Oben