I was changing my mapping files as a result of database changes and I move to use more Foreign Key references and I am now getting the folllowing when updating one of my objects:
object references an unsaved transient instance - save the transient instance before flushing: com.tascon.tim.hibernate.TimUser
I see that this is a known issue and appears to be fixed in 3.0.5, but not in any previous version [2.1.8 for example]. I was trying to avoid upgrading to 3.0.5 if at all possible.
Is there any patch available for 2.1.8?
[b]Hibernate version:2.1.8
[b]Mapping documents:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.1
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="com.tascon.tim.hibernate.Task"
table="tasks"
>
<id
name="taskId"
type="long"
column="task_id"
>
<generator class="identity" />
</id>
<property
name="taskDueDate"
type="java.sql.Timestamp"
column="task_due_date"
length="23"
/>
<property
name="taskNotes"
type="java.lang.String"
column="task_notes"
length="1200"
/>
<property
name="taskCompleteDate"
type="java.sql.Timestamp"
column="task_complete_date"
length="23"
/>
<property
name="taskSource"
type="java.lang.String"
column="task_source"
length="10"
/>
<property
name="taskRescheduleDate"
type="java.sql.Timestamp"
column="task_reschedule_date"
length="23"
/>
<property
name="lastModifiedDate"
type="java.sql.Timestamp"
column="last_modified_date"
length="23"
/>
<property
name="lastModifiedBy"
type="java.lang.String"
column="last_modified_by"
length="20"
/>
<property
name="completeNotApplicable"
type="java.lang.Integer"
column="complete_not_applicable"
length="10"
/>
<!-- Associations -->
<!-- bi-directional many-to-one association to Contact -->
<many-to-one
name="contact"
class="com.tascon.tim.hibernate.Contact"
not-null="true"
>
<column name="contact_id" />
</many-to-one>
<!-- bi-directional many-to-one association to TimUser -->
<many-to-one
name="timUser"
class="com.tascon.tim.hibernate.TimUser"
not-null="true"
>
<column name="tim_users_id" />
</many-to-one>
<!-- bi-directional many-to-one association to LookupTaskType -->
<many-to-one
name="lookupTaskType"
class="com.tascon.tim.hibernate.LookupTaskType"
not-null="true"
>
<column name="task_type" />
</many-to-one>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.1
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="com.tascon.tim.hibernate.TimUser"
table="tim_users"
>
<id
name="id"
type="int"
column="id"
>
<generator class="identity" />
</id>
<property
name="username"
type="java.lang.String"
column="username"
not-null="true"
length="20"
/>
<property
name="passwd"
type="java.lang.String"
column="passwd"
not-null="true"
length="20"
/>
<property
name="firstname"
type="java.lang.String"
column="firstname"
length="20"
/>
<property
name="lastname"
type="java.lang.String"
column="lastname"
length="20"
/>
<property
name="isadmin"
type="java.lang.String"
column="isadmin"
length="1"
/>
<property
name="createDate"
type="java.sql.Timestamp"
column="create_date"
length="23"
/>
<property
name="isconstruction"
type="java.lang.String"
column="isconstruction"
length="1"
/>
<property
name="isSales"
type="java.lang.String"
column="is_sales"
length="1"
/>
<property
name="allReportsAccess"
type="java.lang.String"
column="all_reports_access"
length="1"
/>
<property
name="selectionUnlock"
type="java.lang.String"
column="selection_unlock"
length="1"
/>
<!-- Associations -->
<!-- bi-directional one-to-many association to SalesOpportunity -->
<set
name="salesOpportunities"
lazy="true"
inverse="true"
cascade="none"
>
<key>
<column name="tim_users_id" />
</key>
<one-to-many
class="com.tascon.tim.hibernate.SalesOpportunity"
/>
</set>
<!-- bi-directional one-to-many association to Task -->
<set
name="tasks"
lazy="true"
inverse="true"
cascade="none"
>
<key>
<column name="tim_users_id" />
</key>
<one-to-many
class="com.tascon.tim.hibernate.Task"
/>
</set>
</class>
</hibernate-mapping>
[b] Just and update of a an existing entity pulled in a different session
[b]Full stack trace of any exception that occurs:INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,250 INFO [STDOUT] Hibernate: update tasks set task_due_date=?, task_notes=?, task_complete_date=?, task_source=?, task_reschedule_date=?, last_modified_date=?, last_modified_by=?, complete_not_applicable=?, contact_id=?, tim_users_id=?, task_type=? where task_id=?
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,250 ERROR [SessionImpl] Could not synchronize database state with session
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD Type: class com.tascon.tim.util.HibernateHelper
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD Signature: catch(Exception)
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD at: HibernateHelper.java:60
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD exception: object references an unsaved transient instance - save the transient instance before flushing: com.tascon.tim.hibernate.TimUser
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD stack trace: [Ljava.lang.StackTraceElement;@fe0ce9
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] Hibernate: update tasks set task_due_date=?, task_notes=?, task_complete_date=?, task_source=?, task_reschedule_date=?, last_modified_date=?, last_modified_by=?, complete_not_applicable=?, contact_id=?, tim_users_id=?, task_type=? where task_id=?
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 ERROR [SessionImpl] Could not synchronize database state with session
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD Type: class com.tascon.tim.util.HibernateHelper
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD Signature: catch(Exception)
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD at: HibernateHelper.java:97
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD exception: object references an unsaved transient instance - save the transient instance before flushing: com.tascon.tim.hibernate.TimUser
INFO | jvm 1 | 2005/11/22 21:33:01 | 21:33:01,265 INFO [STDOUT] RRD stack trace: [Ljava.lang.StackTraceElement;@12620b5
INFO | jvm 1 | 2005/11/22 21:33:11 | 21:33:11,187 WARN [SessionImpl] afterTransactionCompletion() was never called
INFO | jvm 1 | 2005/11/22 21:33:11 | 21:33:11,187 WARN [SessionImpl] unclosed connection, forgot to call close() on your session?
[b]Name and version of the database you are using:SQL Server 2000
[b]The generated SQL (show_sql=true): See stack trace above.
[b]Debug level Hibernate log excerpt: