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.  [ 5 posts ] 
Author Message
 Post subject: Problem: Hibernate-Annotations,Foreign-Key(1:1) mit Beispiel
PostPosted: Thu Jan 18, 2007 6:39 am 
Newbie

Joined: Tue Jan 16, 2007 10:25 am
Posts: 11
Hallo, habe mal wieder eine Frage :-)

Und zwar möchte ich eine 1:1 Beziehung mit einem Foreign-key erstellen.

Meine Datenbank sieht folgendermaßen aus.


Tabelle: STUDENT

MATRIKELNR___NAME___VORNAME___VORLESUNGSNR
000000002 ___Meier____Hans_____ 1



Tabelle: VORLESUNG

V_NR___NAME
1______Englisch


Ein STUDENT darf also nur eine VORLESUNG besuchen.

Ich packe im folgenden einfach mal eine Dateien rein, vielleicht hilft das ja noch den ein oder anderen ;-)

Die relevanten Teile habe ich fett markiert.

####################Student.java###################
import java.io.Serializable;

import javax.persistence.*;

@Entity
@SequenceGenerator(name="sequenz", sequenceName="STUDENT_SEQ", initialValue=1, allocationSize=1)
@Table(name = "STUDENT")
public class Student implements Serializable{

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequenz")
@Column(name = "MATRIKELNR")
int matrikelnr;

@Column(name = "NAME")
String name;

@Column(name = "VORNAME")
String vorname;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="VORLESUNGSNR")
Vorlesung vo;

public Vorlesung getVorlesung() {
return vo;
}

public void setVorlesung(Vorlesung vo) {
this.vo = vo;
}


public int getMatrikelnr() {
return matrikelnr;
}

public void setMatrikelnr(int matrikelnr) {
this.matrikelnr = matrikelnr;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getVorname() {
return vorname;
}

public void setVorname(String vorname) {
this.vorname = vorname;
}
}

#################Vorlesung.java#################
package Hibernate_Beziehungen;

import java.io.Serializable;
import javax.persistence.*;


@Entity
@SequenceGenerator(name="sequenz1", sequenceName="VORLESUNG_SEQ", initialValue=1, allocationSize=1)
@Table(name="VORLESUNG")
public class Vorlesung implements Serializable{

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequenz1")
@OneToOne(mappedBy = "VNR")
Student st;


@Column(name="NAME")
String name;

public Student getStudent() {
return st;
}

public void setStudent(Student st) {
this.st = st;
}


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

##################MainClass.java#################
package Hibernate_Beziehungen;

import java.util.Iterator;
import java.util.List;

import org.hibernate.*;
import org.hibernate.cfg.AnnotationConfiguration;

public class MainClass {


private static final SessionFactory sessionFactory =
new AnnotationConfiguration().configure("Hibernate_Beziehungen/hibernate.cfg.xml").buildSessionFactory();


public static void main (String[] args) {

MainClass m = new MainClass();
m.speichern();
}

public void speichern() {

Session session = sessionFactory.openSession();
Transaction trans = session.beginTransaction();

Student st = new Student();
Vorlesung vo = new Vorlesung();

st.setName("Keil");
st.setVorname("Alexander");

vo.setName("Englisch");

st.setVorlesung(vo);

session.save(vo);
//session.save(st);

trans.commit();
session.close();
}
####################hibernate.cfg.xml################

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">
jdbc:oracle:thin:@localhost:1521:XE
</property>
<property name="hibernate.connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="hibernate.connection.username">axk</property>
<property name="hibernate.connection.password">test</property>
<property name="hbm2ddl.auto">create</property>
<mapping class="Hibernate_Beziehungen.Student"/>
<mapping class="Hibernate_Beziehungen.Vorlesung"/>

</session-factory>
</hibernate-configuration>

##################Fehlermeldung###################

Exception in thread "main" org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
at org.hibernate.id.IdentifierGeneratorFactory.get(IdentifierGeneratorFactory.java:59)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:78)
at org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:53)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at Hibernate_Beziehungen.MainClass.speichern(MainClass.java:40)
at Hibernate_Beziehungen.MainClass.main(MainClass.java:19)

Vielleicht kann euch das weiterhelfen! Vielen Dank schon mal! Dieses Mal denke ich auch etwas eher an die Creditpoints :-)


Last edited by Java_Newbie on Thu Jan 18, 2007 10:55 am, edited 2 times in total.

Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 18, 2007 9:23 am 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Hier ist vor ein paar Wochen ein Problem mit _ in Spaltennamen diskutiert worden. Lass diese einfach mal weg. Hast Du Dein Schema von Hibernate erzeugen lassen?

Und Dir fehlt noch eine log4j.properties Datei im /src Verzeichnis. Bei Hibernate muesste eine dabei sein oder bei einem der Tutorials auf meiner Webseite.

_________________
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: Thu Jan 18, 2007 10:55 am 
Newbie

Joined: Tue Jan 16, 2007 10:25 am
Posts: 11
Ich habe noch ein bißchen weiter dran rumgebastelt und noch ein paar Fehler gefunden. Den obigen Quellcode habe ich AKTUALISIERT. Wenn ich mir Daten in der STUDENTEN-Tabelle speicher, klappt es auch soweit. Bei der Tabelle VORLESUNG funktioniert es jedoch noch nicht (siehe Fehlermeldung). Die Sequenz habe ich soweit geprüft, ist ordnungsgemäß angelegt werden, trotzdem gibt er mir diese Fehlermeldung aus.

- Tabellen und Spalten lasse ich mir von Hibernate erzeugen
- "_" im Spaltennamen habe ich auch weggelassen, funktioniert aber immer noch nicht...

Hier Infos zu meiner Sequenz VORLESUNG_SEQ:

Min Value 1
Max Value 99999
Increment By 1
Cycle Flag N
Order Flag N
Cache Size 20
Last Number 21

Ich habe die Klasse Vorlesung nahezu identisch aufgebaut wie Student.
Bei Student funktioniert es, bei Vorlesung jedoch nicht :-(


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 18, 2007 11:02 am 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Jetzt sehe ich etwas. Die ID ist nicht in Ordnung. Entweder nutzt Du composite und embedded oder Du legst ein Integer Property an und schreibst vor dem
public Integer getId() @Id und @GeneratedValue

_________________
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: Thu Jan 18, 2007 11:34 am 
Newbie

Joined: Tue Jan 16, 2007 10:25 am
Posts: 11
package Hibernate_Beziehungen;

import java.io.Serializable;
import javax.persistence.*;


@Entity
@SequenceGenerator(name="sequenz1", sequenceName="VORLESUNG_SEQ", initialValue=1, allocationSize=1)
@Table(name="VORLESUNG")
public class Vorlesung implements Serializable{

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequenz1")
int vorlesungsnr;

@OneToOne(mappedBy = "vorlesung")
Student st;

@Column(name="NAME")
String name;

public Student getStudent() {
return st;
}

public void setStudent(Student st) {
this.st = st;
}

public int getVorlesungsnr() {
return vorlesungsnr;
}

public void setVorlesungsnr(int vorlesungsnr) {
this.vorlesungsnr = vorlesungsnr;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}


Danke, für den Tipp. Bekommst du auch ein Creditpoint für ;-)
Habe das jetzt so verändert...bekomme aber eine neue Fehlermeldung.

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1127)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1283)
at Hibernate_Beziehungen.MainClass.<clinit>(MainClass.java:13)
Exception in thread "main"

Ich befürchte, dass in dieser Zeile noch ein Fehler ist

@OneToOne(mappedBy = "vorlesung")

Ist es richtig, dass ich dort vorlesung reinpacke?


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