Hibernate version: 3.1
Hallo liebe Gemeinde,
ich suche schon den ganzen Abend und finde nicht so recht eine Lösung für mein Problem. Es geht im Grunde um ein M:N-Mapping. Ich habe mich strikt an die Dokumentation gehalten, d.h.
Klasse CPerson:
Code:
class CPerson extends Observable implements Serializable
{
...
private Set SpielteIn;
...
/* getters and setters */
}
Mapping File CPerson.hbm.xml:
Code:
<hibernate-mapping>
<class name="svenali.mediaDB.CPerson" table="PERSON">
<id name="ID" column="P_ID" >
<generator class="native" />
</id>
<set name="SpielteIn" table="REL_SCHAUSPIELER_FILM" fetch="select" inverse="true">
<key column="S_ID" />
<many-to-many column="F_ID" class="svenali.mediaDB.CFilm" />
</set>
...
</hibernate-mapping>
Die REL_SCHAUSPIELER_FILM Tabelle:
Code:
--- Relation REL_SCH_FILM
CREATE TABLE REL_SCHAUSPIELER_FILM (
S_ID int unsigned NOT NULL references PERSON,
F_ID int unsigned NOT NULL references FILM,
PRIMARY KEY(S_ID,F_ID)
) TYPE=MYISAM;
Die Klasse Film ist analog der Klasse CPerson aufgebaut (natürlich mit anderen Attributen). In derem Mapping-File ist die M:N-Beziehung so deklariert:
Code:
<set name="Schauspieler" table="REL_SCHAUSPIELER_FILM">
<key column="F_ID"/>
<many-to-many column="S_ID" class="svenali.mediaDB.CPerson" />
</set>
Im laufenden Betrieb der Applikation lade ich jetzt eine CPerson-Instanz. Folgende Fehlermeldung erscheint:
Quote:
[java] org.hibernate.exception.SQLGrammarException: could not initialize a collection: [svenali.mediaDB.CPerson.SpielteIn#3]
[java] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
[java] at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
[java] at org.hibernate.loader.Loader.loadCollection(Loader.java:2001)
[java] at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
[java] at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
[java] at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:63)
[java] at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
[java] at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
[java] at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
[java] at org.hibernate.collection.AbstractPersistentCollection.readElementExistence(AbstractPersistentCollection.java:142)
[java] at org.hibernate.collection.PersistentSet.add(PersistentSet.java:187)
[java] at svenali.mediaDB.CFilm.addSchauspieler(Unknown Source)
[java] at svenali.ofdb.COFDB.prepareBean(Unknown Source)
[java] at svenali.ofdb.COFDB.getMovie(Unknown Source)
[java] at svenali.gui.CSelectOFDBMovie.ok(Unknown Source)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:597)
[java] at com.trolltech.qt.internal.QSignalEmitterInternal$AbstractSignalInternal.emit_helper(QSignalEmitterInternal.java:346)
[java] at com.trolltech.qt.QSignalEmitter$Signal1.emit(QSignalEmitter.java:195)
[java] at com.trolltech.qt.gui.QDialog.__qt_exec(Native Method)
[java] at com.trolltech.qt.gui.QDialog.exec(QDialog.java:92)
[java] at svenali.gui.CAddMovie.searchInOFDB(Unknown Source)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:597)
[java] at com.trolltech.qt.internal.QSignalEmitterInternal$AbstractSignalInternal.emit_helper(QSignalEmitterInternal.java:346)
[java] Hibernate: select spieltein0_.S_ID as S1_1_, spieltein0_.F_ID as F2_1_, cfilm1_.F_ID as F1_31_0_, cfilm1_.TITEL as TITEL31_0_, cfilm1_.ORIGINALTITEL as ORIGINAL3_31_0_, cfilm1_.ERSCHEINUNGSJAHR as ERSCHEIN4_31_0_, cfilm1_.FSK as FSK31_0_, cfilm1_.SPRACHE as SPRACHE31_0_, cfilm1_.WEITERE_INFOS as WEITERE7_31_0_, cfilm1_.FILMGESELLSCHAFT as FILMGESE8_31_0_, cfilm1_.EIGENTUEMER as EIGENTUE9_31_0_, cfilm1_.GRUPPE as GRUPPE31_0_, cfilm1_.RECHTE as RECHTE31_0_, cfilm1_1_.FILMINHALT as FILMINHALT34_0_, cfilm1_1_.FILMLAENGE as FILMLAENGE34_0_, cfilm1_1_.KURZINHALT as KURZINHALT34_0_, cfilm1_2_.SERIENINHALT as SERIENIN2_35_0_, cfilm1_3_.FOLGENINHALT as FOLGENIN2_36_0_, cfilm1_3_.STAFFEL as STAFFEL36_0_, cfilm1_3_.FOLGENLAENGE as FOLGENLA4_36_0_, cfilm1_3_.SERIE as SERIE36_0_, cfilm1_3_.EIGENTUEMER as EIGENTUE6_36_0_, cfilm1_3_.GRUPPE as GRUPPE36_0_, cfilm1_3_.RECHTE as RECHTE36_0_, case when cfilm1_1_.F_ID is not null then 1 when cfilm1_2_.S_ID is not null then 2 when cfilm1_3_.FOL_ID is not null then 3 when cfilm1_.F_ID is not null then 0 end as clazz_0_ from REL_SCHAUSPIELER_FILM spieltein0_ left outer join FILM cfilm1_ on spieltein0_.F_ID=cfilm1_.F_ID left outer join SPIELFILM cfilm1_1_ on cfilm1_.F_ID=cfilm1_1_.F_ID left outer join SERIE cfilm1_2_ on cfilm1_.F_ID=cfilm1_2_.S_ID left outer join FOLGEN cfilm1_3_ on cfilm1_.F_ID=cfilm1_3_.FOL_ID where spieltein0_.S_ID=?
[java] at com.trolltech.qt.QSignalEmitter$Signal1.emit(QSignalEmitter.java:195)
[java] at com.trolltech.qt.gui.QApplication.exec(Native Method)
[java] at svenali.gui.CEgmont.main(Unknown Source)
[java] Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'cfilm1_2_.S_ID' in 'field list'
[java] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[java] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
[java] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
[java] at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
[java] at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
[java] at com.mysql.jdbc.Util.getInstance(Util.java:381)
[java] at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
[java] at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
[java] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
[java] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
[java] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
[java] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
[java] at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
[java] at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
[java] at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
[java] at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
[java] at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
[java] at org.hibernate.loader.Loader.doQuery(Loader.java:674)
[java] at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
[java] at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
[java] ... 29 more
Diese Spalte ist in der Tat nicht in der Tabelle vorhanden, nur ist mir schleierhaft warum er dieses SQL-Statement so baut. Ich weis nicht weiter. Wie kann ich dieser Fehlermeldung auf die Schliche kommen?
Liebe Grüße,
Sven