Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate foreign key is primary key

Tags:

java

hibernate

DB Table REQUEST:
{
   primary key REQUEST_ID,
   String REQUEST_DETAILS
}

DB Table INVALID_REQUEST_DETAILS{
   (foreign key, primary key) fk_req_id references REQUEST.REQUEST_ID,
   String INVALID_COMMENTS,
   String APPROVER_NAME
}

So as you can see there is one REQUEST to one INVALID_REQUEST_DETAILS. For some reason which I do not understand, I have heard that Hibernate maps this as a many-to-one relationship. I have the following code for my .hbm.xml file:

<hibernate-mapping>
  <class name="InvalidRequestDetails" table="INVALID_REQUEST_DETAILS">  
  <id name="id" column="fk_req_id">
    <generator class="foreign">
        <param name="property">request</param>
    </generator>
  </id>

  ... (other column mappings omitted) ...    

  <many-to-one name="request" class="Request" unique="true" not-null="true" />
 </class>
</hibernate-mapping>

Please don't refer me to "read the hibernate documentation" unless you also provide some explanation, it contains very sparse explanations of concepts and I have already read it. The problem I am having is that my mapping file is obviously wrong since I can't insert any records into my table.

Questions:

  1. How can I fix my .hbm.xml file? Why?
  2. If I have a logically one-to-one relationship as I explained above, why do I need a many-to-one tag? What's really the difference between many-to-one and one-to-one here? When do you use which? Would anything change if my foreign key was NOT also a primary key?
like image 771
KyleM Avatar asked Oct 18 '25 03:10

KyleM


1 Answers

Not sure where you got your information from, but you can certainly model this as a one-to-one. Here's an example of how.

<hibernate-mapping>
  <class name="InvalidRequestDetails" table="INVALID_REQUEST_DETAILS">  
  <id name="id" column="fk_req_id">
    <generator class="foreign">
        <param name="property">request</param>
    </generator>
  </id>

  ... (other column mappings omitted) ...    

  <one-to-one name="request" class="Request" constrained="true" />
 </class>
</hibernate-mapping>
like image 129
Peter Bratton Avatar answered Oct 20 '25 16:10

Peter Bratton