Hallo zusammen,
ich versuch mich in Hibernate einzuarbeiten und habe ein Problem mit der Umsetzung einer many-to-many Beziehung.
Wenn ich in meiner Main Methode (siehe unten) auf die Collection in der Zeile
"aTermin.addTeilnehmer(aPerson1);"
zugreifen möchte, gibt er mir die unten aufgeführte Fehlermeldung aus.
Nachstehend die üblichen Informationen. Ich hoffe ihr könnt mir helfen.
Felix
Hibernate version:3.3
Mapping documents:
<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Document : Termin.hbm.xml
Created on : 29. Mai 2007, 09:43
Author : F.Thomas
Description:
Purpose of the document follows.
-->
<hibernate-mapping package="test1">
<class name="Termin">
<id name="id">
<generator class="native" />
</id>
<property name="titel"/>
<property name="beschreibung"/>
<property name="ort"/>
<many-to-one name="eigentuemer" column="owner" />
<list name="alternativZeiten" table="ALT_Zeit">
<key column="id"/>
<list-index column="lfd_nr"/>
<composite-element class="test1.Zeitpunkt">
<property name="minute" />
<property name="stunde" />
<property name="tag" />
<property name="monat" />
<property name="jahr" />
</composite-element>
</list>
<list name="teilnehmer" table="termin_teilnehmer">
<key column="termin_id"/>
<list-index column="ind"/>
<many-to-many column="person_fid" class="test1.Person" />
</list>
</class>
</hibernate-mapping>
<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test1">
<class name="Person">
<id name="id">
<generator class="native" />
</id>
<property name="vorname"/>
<property name="nachname"/>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
package test1;
public class Start {
public static void main(String[] args)throws Exception {
PersonController aPC = new PersonController();
Person aPerson1 = new Person();
Person aPerson2 = new Person();
aPerson1 = aPC.loadPerson(1);
aPerson2 = aPC.loadPerson(2);
System.out.println(aPerson1.toString());
System.out.println(aPerson2.toString());
TerminController testwerte= new TerminController();
testwerte.setUp();
Termin aTermin = new Termin();
aTermin = testwerte.loadTermin(1);
System.out.println(aTermin.toString());
//Hier gibts die Exception
aTermin.addTeilnehmer(aPerson1);
aTermin.addTeilnehmer(aPerson2);
testwerte.saveTermin(aTermin);
}
}
package test1;
import java.util.*;
public class Termin {
private long id;
private String titel;
private String beschreibung;
private String ort;
private Zeitpunkt zeitpunkt;
private List<Zeitpunkt> alternativZeiten = new ArrayList<Zeitpunkt>();
private List<Person> teilnehmer = new LinkedList<Person>();
private Person eigentuemer;
public List<Person> getTeilnehmer(){
return teilnehmer;
}
public void setTeilnehmer(List<Person> teilnehmer){
this.teilnehmer = teilnehmer;
}
public void addTeilnehmer(Person aPerson){
teilnehmer.add(aPerson);
}
public Person getTeilnehmer(int id){
return teilnehmer.get(id);
}
public void addAlternativZeit (Zeitpunkt aZeitpunkt ){
getAlternativZeiten().add(aZeitpunkt);
}
public String getBeschreibung() {
return beschreibung;
}
public void setBeschreibung(String beschreibung) {
this.beschreibung = beschreibung;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getOrt() {
return ort;
}
public void setOrt(String ort) {
this.ort = ort;
}
public String getTitel() {
return titel;
}
public void setTitel(String titel) {
this.titel = titel;
}
public Zeitpunkt getZeitPunkt() {
return zeitpunkt;
}
public void setZeitPunkt(Zeitpunkt zeitPunkt) {
this.zeitpunkt = zeitPunkt;
}
public String toString(){
return "ID: " + id + ", Titel: " + titel + ", Beschreibung: " + beschreibung + ", Ort: " + ort + ", Zeitpunkt: " + zeitpunkt ;
}
public List<Zeitpunkt> getAlternativZeiten() {
return alternativZeiten;
}
public void setAlternativZeiten(List<Zeitpunkt> alternativZeiten) {
this.alternativZeiten = alternativZeiten;
}
public Person getEigentuemer() {
return eigentuemer;
}
public void setEigentuemer(Person owner) {
this.eigentuemer = owner;
}
}
/*
* Person.java
*
* Created on 31. Mai 2007, 16:55
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package test1;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author F.Thomas
*/
public class Person {
private long id;
private String vorname;
private String nachname;
/** Creates a new instance of Person */
public Person() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getVorname() {
return vorname;
}
public void setVorname(String vorname) {
this.vorname = vorname;
}
public String getNachname() {
return nachname;
}
public void setNachname(String nachname) {
this.nachname = nachname;
}
public String toString(){
return this.id +" " + this.vorname + " " + this.nachname;
}
}
package test1;
import java.util.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.Query;
public class TerminController {
private SessionFactory aSessionFactory;
private Termin termin;
private Session session;
private LinkedList<Termin> termine = new LinkedList<Termin>();
public Termin getTermin() {
return termin;
}
public void setTermin(Termin termin) {
this.termin = termin;
}
public void closeSession(){
this.session.close();
}
protected void setUp(){
Configuration configuration = new Configuration().configure();
aSessionFactory = configuration.buildSessionFactory();
session = aSessionFactory.openSession();
}
public void saveTermin(Termin aTermin){
Transaction transaction = null;
try{
transaction = session.beginTransaction();
session.save(aTermin);
transaction.commit();
}catch(HibernateException e){
if (transaction !=null){
transaction.rollback();
throw e;
}
}finally{
if (session !=null){
//session.close();
}
}
}
public Termin loadTermin(long id){
return (Termin)session.load(Termin.class, id);
}
public LinkedList loadTermine(String ort){
Query query =session.createQuery("from Termin where ort='" + ort + "'");
Iterator<Termin> iterator = query.list().iterator();
while(iterator.hasNext()) {
termine.add(iterator.next());
}
return termine;
}
public void updateTermin(long id, Termin newTermin){
Termin aTermin=null;
aTermin = (Termin) session.load(Termin.class, id);
Transaction transaction = session.beginTransaction();
if (newTermin.getTitel()!=null){
aTermin.setTitel(newTermin.getTitel());
}
if (newTermin.getBeschreibung()!=null){
aTermin.setBeschreibung(newTermin.getBeschreibung());
}
if (newTermin.getZeitPunkt()!=null){
aTermin.setZeitPunkt(newTermin.getZeitPunkt());
}
if (newTermin.getOrt()!=null){
aTermin.setOrt(newTermin.getOrt());
}
transaction.commit();
}
public void deleteTermin(long id){
Termin aTermin= (Termin)session.get(Termin.class,id);
if (aTermin!=null){
Transaction transaction = session.beginTransaction();
session.delete(aTermin);
transaction.commit();
}
}
public String toString(){
String output="Termine";
Iterator<Termin> iterator = termine.iterator();
while(iterator.hasNext()){
Termin aTermin = iterator.next();
output= output + " | " + aTermin.toString();
}
return output;
}
}
Full stack trace of any exception that occurs:
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not initialize a collection: [test1.Termin.teilnehmer#1]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadCollection(Loader.java:2001)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
at org.hibernate.collection.AbstractPersistentCollection.write(AbstractPersistentCollection.java:183)
at org.hibernate.collection.PersistentList.add(PersistentList.java:140)
at test1.Termin.addTeilnehmer(Termin.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157)
at test1.Termin$$EnhancerByCGLIB$$e7277732.addTeilnehmer(<generated>)
at test1.Start.main(Start.java:51)
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'tool.termin_teilnehmer' doesn't exist
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
... 15 more
Name and version of the database you are using: MySQL Server 5.0
The generated SQL (show_sql=true):
Debug level Hibernate log excerpt:
Problems with Session and transaction handling?
Read this:
http://hibernate.org/42.html