Ich habe in dieser Beziehung noch ein weiteres Problem. Wenn ich nun die Collection habe, bestehende Objekte verändere und neue hinzufüge möchte ich sie mit einem Befehl speichern (was ja auch über Cascade="save-update" möglich ist. Ich bekomme auch den Output, dass ein entsprechender Update und Insert Befehl losgeshcickt wurden. Im Anschluss daran versucht Hibernate aber alle Spalten MaId und VonDat der Tabelle die zu dem Mitarbeiter gehören auf NULL zu setzen. WARUM!?! Dies kann natürlich nicht funktionieren, da sie in der Datenbank und wie im Mapping zu sehen als not-null="true" gekennzeichent sind. Ich hoffe Ihr habt ne Erklärung für mich ^^
hier nun mein Code:
Mitarbeiter.hbm.xml
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!-- Created Tue Feb 15 16:12:02 CET 2005 -->
<hibernate-mapping package="de.myCompany.model" default-lazy="false">
<class name="Mitarbeiter" table="mitarbeiter">
<id name="maId" column="ma_id" type="java.lang.Integer">
<generator class="assigned"/>
</id>
<property name="titel" column="titel" type="java.lang.String" />
<property name="vorname" column="vorname" type="java.lang.String" not-null="true" />
<property name="nachname" column="nachname" type="java.lang.String" not-null="true" />
<list name="wochenarbeitsZeiten" table="mitarbeiter_wochen_arb_std" lazy="true" cascade="save-update">
<key column="ma_id" />
<list-index column="von_dat" />
<one-to-many class="MitarbeiterWochenArbStd" />
</list>
</class>
</hibernate-mapping>
MitarbeiterWochenArbStd.hbm.xml
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!-- Created Thu Jul 27 12:11:15 CEST 2006 -->
<hibernate-mapping package="de.myCompany.model" default-lazy="false">
<class name="MitarbeiterWochenArbStd" table="mitarbeiter_wochen_arb_std">
<id name="mwId" column="mw_id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="wochenArbStd" column="wochen_arb_std" type="java.lang.Float" not-null="true" />
<property name="vonDat" column="von_dat" type="java.util.Date" not-null="true" />
<property name="bisDat" column="bis_dat" type="java.util.Date" />
<property name="letzteAenderung" column="letzte_aenderung" type="java.util.Date" not-null="true" />
<property name="bemerkung" column="bemerkung" type="java.lang.String" />
<many-to-one name="mitarbeiter" column="ma_id" class="Mitarbeiter" not-null="true" />
<many-to-one name="bearbeiter" column="bearbeiter" class="Mitarbeiter" not-null="true" />
</class>
</hibernate-mapping>
Quelltext
Code:
public static void main(String[] args){
de.myCompany.model.Mitarbeiter m = null;
try{
org.hibernate.Session s = de.myCompany.hibernate.SessionFactory.currentSession();
org.hibernate.Query q = s.createQuery("from Mitarbeiter m where m.maId=71");
m = (de.fourthproject.controlling.integration.model.Mitarbeiter)q.uniqueResult();
if(m!=null){
m.setWochenarbeitsZeiten(s.createQuery("from MitarbeiterWochenArbStd m where m.mitarbeiter=71").list());
java.util.List l1 = m.getWochenarbeitsZeiten();
System.out.println();
de.myCompany.model.MitarbeiterWochenArbStd mw = (de.myCompany.model.MitarbeiterWochenArbStd) m.getWochenarbeitsZeiten().get(0);
mw.setBisDat(new java.util.Date());
mw = new de.myCompany.model.MitarbeiterWochenArbStd();
mw.setBearbeiter(m);
mw.setBemerkung("");
mw.setLetzteAenderung(new java.util.Date());
mw.setMitarbeiter(m);
mw.setVonDat(new java.util.Date());
mw.setWochenArbStd(new java.lang.Float(30));
m.getWochenarbeitsZeiten().add(mw);
org.hibernate.Transaction trx = s.beginTransaction();
trx.begin();
s.update(m);
trx.commit();
}
}
catch(org.hibernate.HibernateException e ){
System.out.println(e.getMessage());
System.out.println(e.getCause());
e.printStackTrace();
}
finally{
try{
de.myCompany.hibernate.SessionFactory.closeSession();
}
catch(org.hibernate.HibernateException e ){
e.printStackTrace();
}
}
}
und die Fehlerausgabe:
Code:
Hibernate: insert into mitarbeiter_wochen_arb_std (wochen_arb_std, von_dat, bis_dat, letzte_aenderung, bemerkung, ma_id, bearbeiter) values (?, ?, ?, ?, ?, ?, ?) select scope_identity()
Hibernate: update mitarbeiter_wochen_arb_std set wochen_arb_std=?, von_dat=?, bis_dat=?, letzte_aenderung=?, bemerkung=?, ma_id=?, bearbeiter=? where mw_id=?
[b]Hibernate: update mitarbeiter_wochen_arb_std set ma_id=null, von_dat=null where ma_id=?[/b]
could not delete collection:
[de.myCompany.model.Mitarbeiter.wochenarbeitsZeiten#71]
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Der Wert NULL kann in die von_dat-Spalte, mitarbeiter_wochen_arb_std-Tabelle, nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei UPDATE.
org.hibernate.exception.GenericJDBCException: could not delete collection: [de.myCompany.model.Mitarbeiter.wochenarbeitsZeiten#71]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:91)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:79)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.collection.AbstractCollectionPersister.remove(AbstractCollectionPersister.java:980)
at org.hibernate.action.CollectionRemoveAction.execute(CollectionRemoveAction.java:28)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1007)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:354)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at de.myCompany.service.MitarbeiterService.main(MitarbeiterService.java:2718)
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Der Wert NULL kann in die von_dat-Spalte, mitarbeiter_wochen_arb_std-Tabelle, nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei UPDATE.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRPCRequest.processReplyToken(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source)
at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.postImplExecute(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.postImplExecute(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.executeUpdateInternal(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.executeUpdate(Unknown Source)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)
at org.hibernate.persister.collection.AbstractCollectionPersister.remove(AbstractCollectionPersister.java:970)