I'm having some troubles getting using a foreign key as a primary key. In this post I will use the most simple issue I'm having trouble with.
Here's some snippets (pharmacy project):
public abstract class AbstractDrugModel { private String name; private IntravascularDrug ivDrug; }
public class IntravascularDrug { private AbstractDrugModel drug; }
Note 1: I am only just introducing hibernate, previously I did the databases manually and in that scenario IntravascularDrug did not contain an AbstractDrugModel instance.
Note 2: ivDrug can be null.
In my mapping files I have (at this point in time, I've tried other approaches):
<hibernate-mapping> <class lazy="false" name="tciworks.drugmodel.IntravascularDrug" table="IntravascularDrug"> <composite-id> <key-many-to-one name="drug" column="DrugName"/> </composite-id> ... </class> </hibernate-mapping>
<hibernate-mapping> <class dynamic-insert="false" dynamic-update="false" lazy="false" mutable="true" name="tciworks.drugmodel.AbstractDrugModel" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="Drug">
<id column="Name" name="name"/> <discriminator column="DrugModelType"/> ... <many-to-one cascade="all" column="DrugName" name="intravascularDrug" not-null="false" unique="true"/>
<subclass discriminator-value="USER_DEFINED" name="tciworks.drugmodel.userdefined.UserDefinedDrugModel"/> </class> </hibernate-mapping>
This example includes only one concrete sub-class of AbstractDrugModel, there are others. Drug name is unique hence being used as PK.
When I have Hibernate create the database tables everything appears fine, but on save, it seems to be saving IntravascularDrug first and hence gives the following error:
Sun Aug 07 21:03:25 EST 2011: ERROR logExceptions, Cannot add or update a child row: a foreign key constraint fails (`tciworkssqlextension`.`intravasculardrug`, CONSTRAINT `FK19E96D413937CB47` FOREIGN KEY (`DrugName`) REFERENCES `drug` (`Name`))
Does anyone have any suggestions on how I should do this?
I've tried the solution on page 184 of the reference manual and that doesn't work either.
Thanks
Lionel.
|