I have the following two mapping files:
attached below:
I have implemented a one to one relationship between these two entites. The post relationship is a many to one relationship and is unidirectional where as the one to one is a bidirectional relationship.
The problem I am having is that I have set cascade="all" in this mapping:
<one-to-one name="postBenefits"
class="com..hibernate.PostBenefits"
property-ref="benefitId" cascade="all"/>
but when I delete a record in the EmpBenefitDefFile the corresponding record in the PostBenefits table does not get deleted.
I thought cacade all would have done this becuase it does something very similar for the systemBenefit field of the EmpBenefitDefFile.
In this instance deleting a record also deletes the coorect record in the system benefits table.
The log shows the delete of the EmpBenefitDefFile but no delete of the PostBenefits. It is as though the cascade is not being picked up.
There is an exception in the log about mssql database context but this does not affect anything with hibernate as i have had other queries working fine.
All help is appreciated
Hibernate version: 2.1
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>
<class name="com..hibernate.PostBenefits"
table="D2705M">
<id name="postBenfitsRef" column="POST_BEN_REF">
<generator class="assigned"/>
</id>
<many-to-one name="benefitId"
class="com..hibernate.EmpBenefitDefFile"
column="BENEFIT_ID" unique="true" />
<many-to-one name="post"
class="com...hibernate.Post"
column="POST_REF"/>
</class>
</hibernate-mapping>
and
<?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>
<class name="com..hibernate.EmpBenefitDefFile"
table="D2703M">
<id name="benefitId" column="BENEFIT_ID">
<generator class="assigned"/>
</id>
<property name="benefitShortDesc" column="BENEFIT_SHORT_DESC"/>
<property name="benefitLongDesc" column="BENEFIT_LONG_DESC"/>
<property name="benefitTxt" column="BENEFIT_DSP_TEXT"/>
<property name="benefitInputType" column="BENEFIT_INPUT_TYPE" />
<property name="benefitInputCode" column="BENEFIT_INPUT_CODE" />
<property name="benefitRangeFlag" column="BENEFIT_RANGE_FLAG"/>
<property name="benefitObsoleteDate" column="BENEFIT_OBSOLETE_DATE" type="date"/>
<one-to-one name="systemBenefit"
class="com..hibernate.SystemBenefits"
property-ref="benefitId" cascade="all"/>
<one-to-one name="postBenefits"
class="com..hibernate.PostBenefits"
property-ref="benefitId" cascade="all"/>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
EmpBenefitDefFile benFile = createEmpBenefitsFile();
Post post = createPost();
HibernateUtils.getInstance().getHibernateSession();
HibernateUtils.getInstance().beginTransaction();
HibernateUtils.getInstance().getHibernateSession().save(benFile);
HibernateUtils.getInstance().getHibernateSession().save(post);
HibernateUtils.getInstance().commitTransaction();
PostBenefits postFile = new PostBenefits();
postFile.setBenefitId(benFile);
postFile.setPost(post);
postFile.setPostBenfitsRef("postF1");
HibernateUtils.getInstance().beginTransaction();
HibernateUtils.getInstance().getHibernateSession().save(postFile);
HibernateUtils.getInstance().commitTransaction();
PostBenefits postBen = (PostBenefits)HibernateUtils.getInstance().getHibernateSession().
load(PostBenefits.class, postFile.getPrimaryKey());
assertEquals(post.getPrimaryKey(), postBen.getPost().getPrimaryKey());
assertEquals(benFile.getPrimaryKey(), postBen.getBenefitId().getPrimaryKey());
assertEquals(postFile.getPrimaryKey(), postBen.getPrimaryKey());
//clear the seesion of all objects:
//HibernateUtils.getInstance().getHibernateSession().clear();
//delete
HibernateUtils.getInstance().beginTransaction();
//HibernateUtils.getInstance().getHibernateSession().delete(postFile);
HibernateUtils.getInstance().getHibernateSession().delete(benFile);
HibernateUtils.getInstance().commitTransaction();
HibernateUtils.getInstance().closeHibernateSession();
Full stack trace of any exception that occurs:
Name and version of the database you are using:
MSSQL Version 8
The generated SQL (show_sql=true):
Debug level Hibernate log excerpt:
13:21:23,521 DEBUG Cascades:506 - done processing cascades for: com..hibernate.EmpBenefitDefFile
13:21:23,521 DEBUG JDBCTransaction:59 - commit
13:21:23,537 DEBUG SessionImpl:2267 - flushing session
13:21:23,537 DEBUG SessionImpl:2467 - Flushing entities and processing referenced collections
13:21:23,537 DEBUG SessionImpl:2808 - Processing unreferenced collections
13:21:23,537 DEBUG SessionImpl:2822 - Scheduling collection removes/(re)creates/updates
13:21:23,537 DEBUG SessionImpl:2291 - Flushed: 0 insertions, 0 updates, 1 deletions to 3 objects
13:21:23,537 DEBUG SessionImpl:2296 - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
13:21:23,553 DEBUG Printer:75 - listing entities:
13:21:23,553 DEBUG Printer:82 - com..hibernate.EmpBenefitDefFile{postBenefits=null, benefitObsoleteDate=23 February 2006, benefitLongDesc=longdesc, benefitInputType=Type, benefitInputCode=Input, benefitShortDesc=short, benefitId=Test1, systemBenefit=null, benefitTxt=random, benefitRangeFlag=Y}
13:21:23,553 DEBUG Printer:82 - com.hibernate.Post{defaultFormID=default, longDesc=desc, postRef=post001, jobRef=jobRef, number=number}
13:21:23,553 DEBUG Printer:82 - com..hibernate.PostBenefits{postBenfitsRef=postF1, benefitId=EmpBenefitDefFile#Test1, post=Post#post001}
13:21:23,553 DEBUG SessionImpl:2380 - executing flush
13:21:23,553 DEBUG EntityPersister:552 - Deleting entity: [com..hibernate.EmpBenefitDefFile#Test1]
13:21:23,553 DEBUG BatcherImpl:204 - about to open: 0 open PreparedStatements, 0 open ResultSets
13:21:23,553 DEBUG SQL:230 - delete from D2703M where BENEFIT_ID=?
Hibernate: delete from D2703M where BENEFIT_ID=?
13:21:23,553 DEBUG BatcherImpl:253 - preparing statement
13:21:23,553 DEBUG StringType:46 - binding 'Test1' to parameter: 1
13:21:23,553 DEBUG BatcherImpl:211 - done closing: 0 open PreparedStatements, 0 open ResultSets
13:21:23,553 DEBUG BatcherImpl:275 - closing statement
13:21:23,553 DEBUG SessionImpl:2852 - post flush
13:21:23,568 DEBUG SessionImpl:596 - transaction completion
13:21:23,568 DEBUG SessionImpl:2267 - flushing session
13:21:23,568 DEBUG SessionImpl:2467 - Flushing entities and processing referenced collections
13:21:23,568 DEBUG SessionImpl:2808 - Processing unreferenced collections
13:21:23,568 DEBUG SessionImpl:2822 - Scheduling collection removes/(re)creates/updates
13:21:23,568 DEBUG SessionImpl:2291 - Flushed: 0 insertions, 0 updates, 0 deletions to 2 objects
13:21:23,568 DEBUG SessionImpl:2296 - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
13:21:23,568 DEBUG Printer:75 - listing entities:
13:21:23,568 DEBUG Printer:82 - com.hibernate.Post{defaultFormID=default, longDesc=desc, postRef=post001, jobRef=jobRef, number=number}
13:21:23,568 DEBUG Printer:82 - com..hibernate.PostBenefits{postBenfitsRef=postF1, benefitId=EmpBenefitDefFile#Test1, post=Post#post001}
13:21:23,568 DEBUG SessionImpl:2380 - executing flush
13:21:23,568 DEBUG SessionImpl:2852 - post flush
13:21:23,568 DEBUG SessionImpl:578 - closing session
13:21:23,568 DEBUG SessionImpl:3383 - disconnecting session
13:21:23,584 DEBUG JDBCExceptionReporter:26 - SQL Warning
java.sql.SQLWarning: [AC27011]Changed database context to 'ResourceLink'.
at com.inet.tds.e.a(Unknown Source)
at com.inet.tds.e.<init>(Unknown Source)
at com.inet.tds.TdsDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:140)
at net.sf.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:101)
at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1172)
at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:803)
at unitTest.WRHibernateObjectTester.<init>(WRHibernateObjectTester.java:50)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
at junit.framework.TestSuite.createTest(TestSuite.java:135)
at junit.framework.TestSuite.addTestMethod(TestSuite.java:114)
at junit.framework.TestSuite.<init>(TestSuite.java:75)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.getTest(RemoteTestRunner.java:399)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:445)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
13:21:23,584 WARN JDBCExceptionReporter:34 - SQL Warning: 5701, SQLState: 01000
13:21:23,584 WARN JDBCExceptionReporter:35 - [AC27011]Changed database context to 'ResourceLink'.
13:21:23,584 WARN JDBCExceptionReporter:34 - SQL Warning: 5703, SQLState: 01000
13:21:23,584 WARN JDBCExceptionReporter:35 - [AC27011]Changed language setting to us_english.
13:21:23,584 DEBUG DriverManagerConnectionProvider:120 - returning connection to pool, pool size: 1
13:21:23,584 DEBUG SessionImpl:596 - transaction completion
|