Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp
Hibernate version:
3.0
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" >
<hibernate-mapping package="de.myFirm.integration.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" />
<property name="gebDat" column="geb_dat" type="java.util.Date" />
<property name="EDat" column="e_dat" type="java.util.Date" not-null="true" />
<property name="ADat" column="a_dat" type="java.util.Date" />
<property name="aktiv" column="aktiv" type="java.lang.Integer" not-null="true" />
<property name="telFestIntern" column="tel_fest_intern" type="java.lang.String" />
<property name="telFestExtern" column="tel_fest_extern" type="java.lang.String" />
<property name="telFestPrivat" column="tel_fest_privat" type="java.lang.String" />
<property name="telMobil" column="tel_mobil" type="java.lang.String" />
<property name="mobilPublik" column="mobil_publik" type="java.lang.Integer" />
<property name="emailIntern" column="email_intern" type="java.lang.String" />
<property name="emailExtern" column="email_extern" type="java.lang.String" />
<property name="emailPrivat" column="email_privat" type="java.lang.String" />
<property name="accountname" column="accountname" type="java.lang.String" not-null="true" />
<property name="password" column="password" type="java.lang.String" not-null="true" />
<property name="UJahresanspruch" column="u_jahresanspruch" type="java.lang.Float" not-null="true" />
<property name="personalnummer" column="pers_nr" type="java.lang.Integer" not-null="true" />
<property name="letzteAenderung" column="letzte_aenderung" type="java.util.Date" />
<property name="ueberstd" column="akt_ueberstd" type="java.lang.Float" />
<many-to-one name="anstellungsverhaeltnis" column="anstellung_id" class="Anstellungsverhaeltnis" not-null="true" />
<many-to-one name="firma" column="firmen_id" class="Firma" not-null="true" />
<many-to-one name="adresse" column="adress_id" class="Adresse" />
<property name="bearbeiterId" column="bearbeiter" type="java.lang.Integer" />
<list name="maStandorte" table="mitarbeiter_standort" lazy="true" inverse="false" >
<key column="ma_id" />
<list-index base="0" column="msIndex"/>
<one-to-many class="MitarbeiterStandort" />
</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" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!-- Created Thu Jul 27 12:09:48 CEST 2006 -->
<hibernate-mapping package="de.myFirm.integration.model" default-lazy="false">
<class name="MitarbeiterStandort" table="mitarbeiter_standort">
<id name="msId" column="ms_id" type="java.lang.Integer">
<generator class="native"/>
</id>
<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" />
<!-- Es ist extra keine many-to-one zu Mitarbeiter, da hier doppelte Objekte in der Applikation vermieden werden sollen.-->
<property name="mitarbeiterId" column="ma_id" type="java.lang.Integer" not-null="true" />
<property name="bearbeiterId" column="bearbeiter" type="java.lang.Integer" not-null="true" />
<property name="standortId" column="stand_id" type="java.lang.Integer" not-null="true" />
<property name="index" column="msIndex" type="java.lang.Integer" not-null="true" />
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
/*Beispielhaftes Laden, Nutzen, Löschen*/
Query q = s.createQuery("from Mitarbeiter as m where m.maId=:id");
q.setInteger("id",1);
Mitarbeiter m = (Mitarbeiter) q.uniqueResult();
for(ListIterator li = m.getMaStandorte().listIterator();li.hasNext();){
MitarbeiterStandort ms = (MitarbeiterStandort)li.next();
if(ms!=null){
System.out.println("maid: "+ms.getMitarbeiterId()+" standid: "+ms.getStandortId()+" von: "+ms.getVonDat()+" bis: "+ms.getBisDat());
}
}
Transaction trx = s.beginTransaction();
s.delete(m.getMaStandorte().get(m.getMaStandorte().size()-1));
trx.commit();
s.refresh(m);
Full stack trace of any exception that occurs:
Hibernate: select mastandort0_.ma_id as ma6_1_, mastandort0_.ms_id as ms1_1_, mastandort0_.msIndex as msIndex1_, mastandort0_.ms_id as ms1_36_0_, mastandort0_.von_dat as von2_36_0_, mastandort0_.bis_dat as bis3_36_0_, mastandort0_.letzte_aenderung as letzte4_36_0_, mastandort0_.bemerkung as bemerkung36_0_, mastandort0_.ma_id as ma6_36_0_, mastandort0_.bearbeiter as bearbeiter36_0_, mastandort0_.stand_id as stand8_36_0_, mastandort0_.msIndex as msIndex36_0_ from mitarbeiter_standort mastandort0_ where mastandort0_.ma_id=?
Hibernate: update mitarbeiter_standort set ma_id=?, msIndex=? where ms_id=?
org.hibernate.TransientObjectException: de.myFirm.integration.model.MitarbeiterStandort
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:71)
at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:697)
at org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1200)
at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:56)
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:143)
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.myFirm.business.service.Testclass.test(Testclass.java:77)
at de.myFirm.business.service.Testclass.main(Testclass.java:106)
Name and version of the database you are using:
Microsoft SQL Server 2000 SP4
The generated SQL (show_sql=true):
Debug level Hibernate log excerpt:
Allgemein versuche ich folgende Testsituation herzustellen:
1. Auslesen eines Mitarbeiters mit seinen historisierten Standortzuweisungen
2. Löschen eines Eintrages
3. Hinzufügen eines neuen Eintrages
All diese Änderungen sollen möglichst über ein Update des Mitarbeiter-Objektes erfolgen, so dass ich nicht die einzelnen Sachen explizit speichern/löschen muss. Beim Löschvorgang ist mir bisher aufgefallen, dass wenn ich aus der Liste ein Objekt entferne und Mitarbeiter per UPDATE aktualisiere, Hibernate statt einem DELETE-Befehl einen UPDATE-Befehl losschickt, der alle Spalten des gelöschen Objektes auf NULL setzen soll (WARUM?!?). Daher habe ich dafür schon mal einen einzelnen DELETE-Befehl eingebaut.
Per session.refresh() soll das Objekt aktualisiert werden, damit auch das gelöschte Objekt auch aus der Liste entfernt wird (habe es auch mit manuellem entfernen probiert ->liste.remove(Object o);)
Was mir jetzt jedoch nicht klar ist, warum bekomme ich nun bei einem erneuten UPDATE des Mitarbeiters die Meldung, ich hätte ein transientes Objekt. Ok, es ist ein neues in der Liste aber müsste das nicht automatisch in der Datenbank gespeichert werden?