Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #6853

Re: Hibernate foreign key as primary key

From Robert Klemme <shortcutter@googlemail.com>
Newsgroups comp.lang.java.programmer
Subject Re: Hibernate foreign key as primary key
Date 2011-08-07 18:03 +0200
Message-ID <4E3EB736.2010208@googlemail.com> (permalink)
References <4e3e78a1@dnews.tpgi.com.au>

Show all headers | View raw


On 07.08.2011 13:38, Lionel wrote:
> This may be a little off topic but I'm sure there are some experts in here.
>
> 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

Why "many to one"?  Isn't this a "one to one" relationship?  At least 
from the looks of your classes it seems to be so.

> 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?

With Oracle you could mark the FK as "deferrable initially deferred" 
which basically means that the constraint is checked at commit time and 
not when updates happen.  Maybe your RDBMS supports this feature as well.

My Hibernate foo is a bit rusty but I think that is the only way to 
solve this with the current class layout because if you have a 
bidirectional one to one relationship one record has to be inserted into 
the database first - which means that the other one isn't there.  And if 
the FK field is not allowed to be NULL on both sides then this can never 
work (unless, again, the RDBMS supports deferred constraints).

I don't know if Hibernate is smart enough to figure insertion order if 
one of the two sides is allowed to be NULL.  What do the docs say?

Kind regards

	robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Hibernate foreign key as primary key Lionel <lionelv@none.com> - 2011-08-07 21:38 +1000
  Re: Hibernate foreign key as primary key markspace <-@.> - 2011-08-07 07:07 -0700
  Re: Hibernate foreign key as primary key Robert Klemme <shortcutter@googlemail.com> - 2011-08-07 18:03 +0200
  Re: Hibernate foreign key as primary key Frank Langelage <frank@lafr.de> - 2011-08-07 18:45 +0200
    Re: Hibernate foreign key as primary key Robert Klemme <shortcutter@googlemail.com> - 2011-08-07 19:14 +0200
      Re: Hibernate foreign key as primary key Lionel <lionelv@none.com> - 2011-08-08 20:11 +1000
        Re: Hibernate foreign key as primary key Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-08-08 18:26 -0300
          Re: Hibernate foreign key as primary key Lionel <lionelv@none.com> - 2011-08-09 18:56 +1000
            Re: Hibernate foreign key as primary key Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-08-09 21:45 -0300
        Re: Hibernate foreign key as primary key Lew <lewbloch@gmail.com> - 2011-08-10 09:58 -0700

csiph-web