david wrote:
The Docs (and HIA) have a section on Parent Child relationships. Have a read as it has some very good information.
Thank you for your answer.
I always have the doc at hand but dont have the time to read it entirely :-(
I have red the chapter 21 : Parent/Child example and have done the following :
- corrected my IParty.hbm.xml file (superclass of Worker) as follow :
Code:
<set
name="contactPoints"
inverse="true"
cascade="all-delete-orphan" >
<key column="partyId" not-null="true" />
<one-to-many class="bab.admin.model.persistent.ContactPoint" />
</set>
- added a method setParty to my ContactPoint class :
- edited my Worker addContactPoint method :
Code:
public void addContactPoint( ContactPoint contactPoint )
{
contactPoint.setParty( this );
contactPoints.add( contactPoint );
}
- added the many-to-one relation to my ContactPoint.hbm.xml :
Code:
<many-to-one
name="party"
column="partyId"
not-null="true"
/>
But the problem is always "Duplicate key or integrity constraint violation message from server: "Cannot add or update a child row: a foreign key constraint fails"
Thank you for your help !
Best regards
Lilian
PS what is "HIA" ?
Hibernate version: 3.0
Mapping documents:Worker.hbm.xmlCode:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<subclass
name="bab.admin.model.persistent.Worker"
discriminator-value="worker"
extends="bab.admin.model.persistent.IParty" >
<set
name="specialities"
table="t_workerspeciality"
lazy="true"
inverse="true"
cascade="save-update"
sort="unsorted" >
<key column="partyId"></key>
<many-to-many
class="bab.admin.model.persistent.Speciality"
column="specialityId"
outer-join="auto" />
</set>
<join table="t_avs">
<key column="partyId" />
<component name="avs">
<property name="cotise" column="cotiseYN" type="java.lang.Boolean"/>
<property name="number" column="avsNumber" />
<property name="requestDate" />
<property name="expeditionDate" />
<property name="receptionDate" />
</component>
</join>
<join table="t_person">
<key column="partyId" />
<property name="sex" />
<property name="title" />
<property name="maritalStatus" column="maritalStatusCode" />
<property name="birthdate" />
<property name="accountInfo" />
<component
name="fullname"
class="bab.admin.model.persistent.Fullname" >
<property name="firstname" />
<property name="lastname" />
</component>
</join>
<join table="t_worker">
<key column="partyId" />
<property name="enabled" type="java.lang.Boolean" update="true"
insert="true" access="property" column="enabledYN" not-null="false"
unique="false" />
<property name="critic" type="java.lang.String" update="true"
insert="true" access="property" column="critic" not-null="false"
unique="false" />
<property name="compliment" type="java.lang.String"
update="true" insert="true" access="property" column="compliment"
not-null="false" unique="false" />
<property name="motivationCode" type="java.lang.String"
update="true" insert="true" access="property" column="motivationCode"
not-null="true" unique="false" />
<property name="motivationShortCode" type="java.lang.String"
update="true" insert="true" access="property"
column="motivationShortCode" not-null="true" unique="false" />
<property name="affiliationDate" type="java.util.Date"
update="true" insert="true" access="property"
column="affiliationDate" not-null="true" unique="false" />
<property name="lastReactivationDate" type="java.util.Date"
update="true" insert="true" access="property"
column="lastReactivationDate" not-null="false" unique="false" />
<property name="workPermitCode" type="java.lang.String"
update="true" insert="true" access="property" column="workPermitCode"
not-null="true" unique="false" />
<property name="authorizationExpirationDate"
type="java.util.Date" update="true" insert="true" access="property"
column="authorizationExpirationDate" not-null="false" unique="false" />
<property name="source" type="java.lang.Boolean" update="true"
insert="true" access="property" column="sourceYN" not-null="false"
unique="false" />
<many-to-one
name="activity"
column="activityId" />
</join>
<join table="t_workerDisponibility" >
<key column="partyId" />
<component
name="disponibilities"
class="bab.admin.model.persistent.Disponibility" >
<property name="mondayMorning" column="mondayMorningYN" />
<property name="mondayAfternoon" column="mondayAfternoonYN" />
<property name="mondayNight" column="mondayNightYN" />
<property name="tuesdayMorning" column="tuesdayMorningYN" />
<property name="tuesdayAfternoon" column="tuesdayAfternoonYN" />
<property name="tuesdayNight" column="tuesdayNightYN" />
<property name="wednesdayMorning" column="wednesdayMorningYN" />
<property name="wednesdayAfternoon" column="wednesdayAfternoonYN" />
<property name="wednesdayNight" column="wednesdayNightYN" />
<property name="thursdayMorning" column="thursdayMorningYN" />
<property name="thursdayAfternoon" column="thursdayAfternoonYN" />
<property name="thursdayNight" column="thursdayNightYN" />
<property name="fridayMorning" column="fridayMorningYN" />
<property name="fridayAfternoon" column="fridayAfternoonYN" />
<property name="fridayNight" column="fridayNightYN" />
<property name="saturdayMorning" column="saturdayMorningYN" />
<property name="saturdayAfternoon" column="saturdayAfternoonYN" />
<property name="saturdayNight" column="saturdayNightYN" />
<property name="sundayMorning" column="sundayMorningYN" />
<property name="sundayAfternoon" column="sundayAfternoonYN" />
<property name="sundayNight" column="sundayNightYN" />
<property name="february" column="februaryYN" />
<property name="paques" column="paquesYN" />
<property name="summer" column="summerYN" />
<property name="autumn" column="autumnYN" />
<property name="noel" column="noelYN" />
<property name="jeunegenevois" column="jeunegenevoisYN" />
<property name="ascension" column="ascensionYN" />
<property name="pentecote" column="pentecoteYN" />
</component>
</join>
</subclass>
</hibernate-mapping>
IParty.hbm.xml :Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="bab.admin.model.persistent.IParty" table="t_party"
dynamic-update="false" dynamic-insert="false"
select-before-update="false" optimistic-lock="version">
<id name="id" column="partyId" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<discriminator column="partyType" />
<property name="comment" />
<set
name="contactPoints"
inverse="true"
cascade="all-delete-orphan" >
<key column="partyId" not-null="true" />
<one-to-many class="bab.admin.model.persistent.ContactPoint" />
</set>
</class>
</hibernate-mapping>
ContactPoint :Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="bab.admin.model.persistent.ContactPoint" table="t_contactPoint"
dynamic-update="false" dynamic-insert="false"
select-before-update="false" optimistic-lock="version">
<id name="id" column="contactPointId" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<discriminator column="contactType" />
<property name="prefered" column="primaryContactPointYN" not-null="true" />
<many-to-one
name="party"
column="partyId"
not-null="true"
/>
</class>
</hibernate-mapping>
The method I use to save:Code:
public void save( Collection workers ) throws InfrastructureException
{
try
{
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
for ( Iterator iter = workers.iterator(); iter.hasNext(); )
{
Worker worker = (Worker)iter.next();
session.save( worker );
}
tx.commit();
HibernateUtil.closeSession();
}
catch ( HibernateException ex )
{
throw new InfrastructureException( ex );
}
}
Full stack trace of any exception that occurs:bab.admin.model.exceptions.InfrastructureException: org.hibernate.exception.ConstraintViolationException: could not insert: [bab.admin.model.persistent.EmailContactPoint]
at bab.admin.model.dao.WorkersDAO.save(WorkersDAO.java:132)
at bab.admin.model.dao.WorkersDAOTests.testSaveOneWorker(WorkersDAOTests.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:474)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:342)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:194)
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [bab.admin.model.persistent.EmailContactPoint]
at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1790)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2192)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:34)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:238)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:158)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:96)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:416)
at org.hibernate.engine.Cascades$5.cascade(Cascades.java:153)
at org.hibernate.engine.Cascades.cascade(Cascades.java:721)
at org.hibernate.engine.Cascades.cascadeCollection(Cascades.java:860)
at org.hibernate.engine.Cascades.cascade(Cascades.java:739)
at org.hibernate.engine.Cascades.cascade(Cascades.java:817)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:361)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:263)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:158)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:429)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:424)
at bab.admin.model.dao.WorkersDAO.save(WorkersDAO.java:125)
... 14 more
Caused by: java.sql.SQLException: Duplicate key or integrity constraint violation message from server: "Cannot add or update a child row: a foreign key constraint fails"
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1997)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1167)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1278)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2251)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1772)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1619)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1772)
... 42 more
Name and version of the database you are using:MySQL 4.1
The generated SQL (show_sql=true):Hibernate: insert into t_party (comment, partyType) values (?, 'worker')
Hibernate: insert into t_avs (cotiseYN, avsNumber, requestDate, expeditionDate, receptionDate, partyId) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into t_person (sex, title, maritalStatusCode, birthdate, accountInfo, firstname, lastname, partyId) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into t_worker (enabledYN, critic, compliment, motivationCode, motivationShortCode, affiliationDate, lastReactivationDate, workPermitCode, authorizationExpirationDate, sourceYN, activityId, partyId) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into t_workerDisponibility (mondayMorningYN, mondayAfternoonYN, mondayNightYN, tuesdayMorningYN, tuesdayAfternoonYN, tuesdayNightYN, wednesdayMorningYN, wednesdayAfternoonYN, wednesdayNightYN, thursdayMorningYN, thursdayAfternoonYN, thursdayNightYN, fridayMorningYN, fridayAfternoonYN, fridayNightYN, saturdayMorningYN, saturdayAfternoonYN, saturdayNightYN, sundayMorningYN, sundayAfternoonYN, sundayNightYN, februaryYN, paquesYN, summerYN, autumnYN, noelYN, jeunegenevoisYN, ascensionYN, pentecoteYN, partyId) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into t_contactPoint (primaryContactPointYN, partyId, emailAddress, contactType) values (?, ?, ?, 'contact.type.email')
[/code]