[Hibernate]1:1 Beziehung

hyperion

Bekanntes Mitglied
Hallo,

so endlich passiert auch mal was bei meiner Anwendung.
Ich habe zwei Tabellen.
User:
-User_id
-LoginName
-LoginPassword
-Mail
-RegisterDate
-Person_ID

Person:
-Person_ID
-Name
-FirstName
-Birthday

Entsprechend der Tabellen habe ich zwei Klassen Person und User. Nun möchte ich Objekte dieser Klassen in die Datenbank eintragen. Ich habe dazu eine Registrierungsseite erstellt, welche die Eigenschaften füllt.
Mit der Methode register() stoße ich dann das Registrieren an und es funktioniert sogar fast. Es wird jeweils ein Datensatz je Tabelle angelegt, allerdings ist das Feld Person_ID in der Tabelle User leer. Ich denke hier fehlt noch irgendwas bei den Annotations. Könnt Ihr mir da noch mal helfen?

Java:
@Entity
public class Person implements Serializable{

     @Id
     @Column(name = "ID", nullable = false)
     @GeneratedValue(strategy=GenerationType.AUTO)
     @NotNull
     private Integer id;

     @Column(name = "Name", nullable = false)
     @NotNull
     private String name;

     @Column(name = "FirstName", nullable = false)
     @NotNull
     private String firstName;

    @Column(name = "Birthday", nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    @Past
    private Date birthday;

     public Person(){
         
     }
     
     ...Getter und Setter...
}

Java:
@Entity
@Table(name="User")
@SequenceGenerator(name="ID", initialValue=1, allocationSize=1)
public class User implements Serializable{

    @Column(name = "ID", nullable = false)
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @NotNull
    private int id;

    @Column(name = "LoginName", nullable = false)
    @NotNull
    private String loginName;

    @Column(name = "LoginPassword", nullable = false)
    @NotNull
    private String loginPassword;

    @NotNull
    @OneToOne
    @JoinColumn(name="Person_ID")
    private Person person;

    @Column(name = "Mail", nullable = false)
    @NotNull
    private String mail;

    @Column(name = "RegisterDate", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    @NotNull
    private Date registerDate;

   ...Getter und Setter...
}

Gruß hyperion
 

jwiesmann

Bekanntes Mitglied
ich glaub das richtige Tag wäre
Java:
@OneToOne(mappedBy = "Person_ID")
private Person person;


Des Weiteren fehlt doch in Person noch die Referenz zu User
Java:
@OneToOne(mappedBy = "Person_ID")
private User user;

aber ich bin mir absolut nicht sicher :)
 

jwiesmann

Bekanntes Mitglied
Ich hab leider nix da mit Hibernate ..
aber grundsätzlich wäre es wie folgt:

Java:
User u = new User();
u.set..

Person p = new Person();
p.set...

em.persist(p);

u.setPerson(p);
em.persist(u);
Das sollte schon reichen .. grob .. halt :D
 

hyperion

Bekanntes Mitglied
Hallo,

hmm scheinbar verwendet Ihr da andere Methoden.
Bei mir sieht das so aus:
Java:
 public String register(){

       user.setRegisterDate(new Date());
       Transaction tx = null;
       Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
       try {
          tx = session.beginTransaction();
          session.save(person);
          session.save(user);
          tx.commit();
          return "success";
        } catch (RuntimeException e) {
          if (tx != null && tx.isActive()) {
            try {
    // Second try catch as the rollback could fail as well
              tx.rollback();
            } catch (HibernateException e1) {

            }
    // throw again the first exception
            throw e;
          }
        }
       return "failed";
    }

Von welchem Typ ist em?

Gruß hyperion
 

KSG9|sebastian

Top Contributor
em = EntityManager

EntityManager ist aus JPA und entspricht mehr oder minder der Session aus Hibernate.

Hast du die Ratschläge befolgt?

1. mappedBy
2. @OneToManny
3. Cascade versucht?

@OneToMany( cascade = {CascadeType.ALL} )
 

X5-599

Top Contributor
Ein paar Dinge von mir:

Das mapping von user zu person in der Klasse User sieht schon ganz gut aus:

Java:
@OneToOne
@JoinColumn(name="Person_ID")
private Person person;

Aber das id Feld sollte so aussehen:

Java:
@Column(name = "User_id", nullable = false)
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

Wegen dem GenerationType.AUTO bin ich mir nicht 100% sicher, da ich für gewöhnlich GenerationType.SEQUENCE mit Datenbankseitigen Sequenzen benutze. Auch habe ich die @NotNull Annotation weggelassen, denn nach meinem Wissensstand ist das dasselbe wie der Zusatz nullable = false in der @Column/@JoinColumn Annotation. (Bitte berichtigen, wenn ich falsch liege)

In der Person Klasse müsste das id Feld ebenfalls geändert werden:

Java:
@Column(name = "Person_ID", nullable = false)
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

Die @NotNull Dinger würde ich auch hier alle entfernen.

Nochmal: Ich habe noch nie mit GenerationType.AUTO gearbeitet. Aber so wie ich es verstehe muss der name = "attribut_id" in der @Column Annotation derselbe sein wie in der entsprechenden Tabelle.


Und zu dem Vorschlag mit dem mappedBy:
Sowas macht man, wenn man eine bi-direktionale Beziehung aufbauen möchte. Am Beispiel hier:

Im Moment hat 1 User-Objekt 1 Person-Objekt
Ein User-Objekt weiss also genau welches Person-Objekt zu ihm gehört. Ein Person-Objekt weiss aber nicht zu welchem User-Objekt es gehört...
Um das zu erreichen muss man in der Klasse Person folgendes haben:

Java:
@OneToOne(mappedBy = "person")
private User user;

Das ist auch schon alles. Ein mappedBy auf beiden Seiten der Beziehung kann nicht funktionieren! Auch muss das mappedBy einen Attributsnamen(hier: person) angeben. Keine Tabellenspalte. Das sagt Hibernate das die Beziehung zu User bereits in der User Klasse durch das person-Attribut realisiert wurde.


Soweit dazu. Ich bin bei weitem kein Experte auf dem Gebiet, und das was ich hier geschrieben habe basiert auf meinen eigenen Erfahrungen mit Hibernate.

Bitte um Korrektur, falls etwas grundlegend Falsches dabei war!


Gruß
 

hyperion

Bekanntes Mitglied
Hallo,

also es funktioniert jetzt:

User
Java:
@Entity
@Table(name="User")
public class User implements Serializable{

    @Column(name = "User_ID", nullable = false)
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(name = "LoginName", nullable = false)
    private String loginName;

    @Column(name = "LoginPassword", nullable = false)
    private String loginPassword;

    @ManyToOne
    @JoinColumn(name="Person_ID")
    private Person person;

    @Column(name = "Mail", nullable = false)
    private String mail;

    @Column(name = "RegisterDate", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date registerDate;
}

Person
Java:
@Entity
@Table(name="Person")
public class Person implements Serializable{

     @Id
     @Column(name = "Person_ID", nullable = false)
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Integer id;

     @Column(name = "Name", nullable = false)
     private String name;

     @Column(name = "FirstName", nullable = false)
     private String firstName;

     @OneToOne(mappedBy="person")
     private User user; 

    @Column(name = "Birthday", nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    @Past
    private Date birthday;

register
Java:
 public String register(){

       user.setRegisterDate(new Date());
       Transaction tx = null;
       Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
       try {
          tx = session.beginTransaction();
          user.setPerson(person);
          person.setUser(user);
          session.save(person);
          session.save(user);
          tx.commit();
          return "success";
        } catch (RuntimeException e) {
          if (tx != null && tx.isActive()) {
            try {
    // Second try catch as the rollback could fail as well
              tx.rollback();
            } catch (HibernateException e1) {

            }
    // throw again the first exception
            throw e;
          }
        }
       return "failed";
    }

Gruß hyperion
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Hibernate 1:n Beziehung mit Vererbung Data Tier 5
G Hibernate 0...1 : 1 Beziehung Data Tier 6
K hibernate manytoone beziehung und fremdschlüssel als primary schlüssel Data Tier 2
N Hibernate Annotations Rekursive Beziehung? Data Tier 2
I Hibernate / JPA: Eine Datenbank und pro User ein Schema Data Tier 9
T Hibernate/Spring JPA: eigene ID generieren Data Tier 5
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
D Hibernate Hibernate mit MariaDB Data Tier 1
ToBJo Hibernate Glassfish deploy mit Hibernate schlägt fehl Data Tier 1
C JPA Hibernate Map<String,String> richtig mappen Data Tier 2
S JPA Hibernate Search & EclipseLink (oder OpenJPA) Data Tier 0
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
ARadauer Hibernate Entität readonly laden... Data Tier 1
G Hibernate SQL in Hibernate: Keine Parameter mit Index? Data Tier 2
P Wildfly + Hibernate + SQL Server Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
B Hibernate und MySQL testen Data Tier 8
I Hibernate HQL: generiertes SQL ausgeben Data Tier 1
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
R Hibernate Hibernate und Logback Data Tier 2
R Hibernate möchte Schema zwei mal undeployen Data Tier 2
F Hibernate Hibernate / JPA Data Tier 4
E Hibernate: Session vs EntityManager Data Tier 3
C Hibernate Hibernate Code Generation Data Tier 3
S Hibernate Mehrfachverbindung mit Hibernate Data Tier 3
M Hibernate Einstiegsfrage Data Tier 5
M Exception in thread "main" org.hibernate.MappingException: java.lang.ClassNotFoundException: Message Data Tier 4
S Hibernate Einstieg in Hibernate 3.2 sinnvoll? Data Tier 8
P JPA Eigene Vererbungsstrategie mit JPA / Hibernate Data Tier 2
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
Y Jboss seam-hibernate-jpa Data Tier 5
RaoulDuke Hibernate Map<String,String> mit Annotations mappen Data Tier 2
M Hibernate Hibernate with GWT Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
pg1337 Hibernate Fragen Data Tier 11
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
2 Hibernate Annotations Data Tier 7
G Hibernate select update no wait Data Tier 8
Z Hibernate: Many-To-Many nur eine bestimmte Spalte Data Tier 3
K Hibernate - Envers - Erzeugung der SQL Skripte Data Tier 4
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
L Hibernate: failed to lazily initialize a collection of role Data Tier 3
S Hibernate hibernate.cfg.xml Data Tier 14
D JPA vs Hibernate.cfg und Entitymanager Data Tier 6
H Hibernate - Mapping für Enumeration Data Tier 1
R Hibernate Criteria Abfrageproblem Data Tier 2
A Hibernate und jdbc zusammen Data Tier 4
D Mit Hibernate aus JUnit ein DB-Schema erzeugen Data Tier 6
S [Hibernate] No Persistence provider for EntityManager Data Tier 5
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
G Hibernate HQL und Interface Data Tier 4
G JSF Hibernate no session or session was closed Data Tier 12
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
X [Hibernate] Zusammengesetzte Entities möglich? Data Tier 7
N Hibernate Fake? Data Tier 2
S Problem beim Insert mit Hibernate Data Tier 9
V Hibernate Projection Data Tier 2
T org.hibernate.impl.SessionFactoryImpl Memory Leak Data Tier 10
G Hibernate Composite key Data Tier 11
X [Hibernate] Connection Pool - MinSize ? Data Tier 2
R Hibernate Criteria OR Data Tier 2
T hibernate/jpa abgefragte Listen immer mit Null-Werten gefüllt Data Tier 8
X [Hibernate] Anderen Connection Pool - Vorschläge? Data Tier 3
ARadauer Hibernate DDL Loggen Data Tier 6
G Hibernate abfrage Collection Data Tier 3
X [Hibernate] ReverseEngineering - Eigene Strategy verwenden? Data Tier 3
R Hibernate Criteria .group größer als Data Tier 5
R Hibernate daten laden Data Tier 7
H [Hibernate]No CurrentSessionContext configured! Data Tier 6
X [Hibernate] Lässt sich die Dauer eines SELECTs loggen? Data Tier 4
R Hibernate n:n Relationtabelle mit Date Data Tier 3
H [Hibernate] Unknown Entity Data Tier 3
H [Hibernate] Configuration Data Tier 3
C [Hibernate] Generierung von hbm.xml to Java Data Tier 4
lumo Eclipse & JPA & Hibernate & Derby Data Tier 5
J Zufallsauswahl aus ResultList bei JPA(Hibernate) / Performance Data Tier 3
M Hibernate: Datum 0001-01-01 erzeugt null-Datum Data Tier 4
G Datenbankzugriff mit Hibernate Data Tier 7
Y Hibernate - Angabe des Schemas Data Tier 6
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M Hibernate Mehr als 1 Object speichern? Data Tier 18
M Unerklärliche Hibernate Exception Data Tier 20
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9
haemi Viele DTOs in hibernate IdentityMap Data Tier 3
LadyMilka (hibernate) UNION dem Dialekt hinzufügen Data Tier 3
M Hibernate + Oracle 10g XE Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
P SQL PRoblem Hibernate? Data Tier 8
J Vererbung mit JPA / Hibernate - pro/contra Data Tier 3
T JBoss/Hibernate: Abfrage dauert lang + hohe CPU? Data Tier 19
7 Hibernate-Abfrage (SubSelect im FROM) Data Tier 2
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
G Layer für Datenbankzugriff Hibernate Data Tier 5
G Hibernate Zwischentabelle Data Tier 2
Java.getSkill() Hibernate und Spalte vom Typ xml Data Tier 6

Ähnliche Java Themen


Oben