-->
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: could not initialize a collection
PostPosted: Wed Jun 06, 2007 8:30 am 
Newbie

Joined: Wed Jun 06, 2007 8:09 am
Posts: 14
Location: Germany
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


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 06, 2007 8:45 am 
Regular
Regular

Joined: Fri May 12, 2006 4:05 am
Posts: 106
Hallo,

wenn mysql anmeckert, dass die Tabelle tool.termin_teilnehmer fehlt würde ich erstmal zugunsten der Datenbank annehmen, dass dem auch so ist. Hätte die Hibernate anlegen sollen oder wolltest Du das selbst machen?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 06, 2007 8:48 am 
Newbie

Joined: Wed Jun 06, 2007 8:09 am
Posts: 14
Location: Germany
Danke für deine schnelle Antwort!

Ich dachte Hibernate macht das für mich. So war es jedenfalls an andere Stelle, als ich die many-to-one verbindung zwischen Termin und Person ausprobierte.

Was müsste ich den tun, damit Hibernate das für mich erledigt?

Felix


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 06, 2007 9:11 am 
Regular
Regular

Joined: Fri May 12, 2006 4:05 am
Posts: 106
hibernate macht so was nur, wenn man es ihm explizit sagt.
Dazu einfach in die hibernate.cfg.xml noch folgendes einfügen:
<property name="hbm2ddl.auto">create</property>

Dann müssten alle Tabellen beim starten von hibernate angelegt werden.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 06, 2007 9:34 am 
Newbie

Joined: Wed Jun 06, 2007 8:09 am
Posts: 14
Location: Germany
Super das war's

Danke


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.