2013-03-04 106 views
0

我正試圖與hibernate實體進行「一對一」映射。 學生表具有contact_info作爲外鍵參考。 當我保存學生對象時,外鍵設置爲NULL。在外鍵中休眠一對一

這裏我有附加的來源。請讓我知道這個問題...

表:

DROP TABLE IF EXISTS cont_info; 
CREATE TABLE cont_info(
ID INT PRIMARY KEY AUTO_INCREMENT, 
MOBILE_NO VARCHAR(40), 
EMAIL_ID VARCHAR(40) 
); 

DROP TABLE IF EXISTS student; 
CREATE TABLE student(
ID INT PRIMARY KEY AUTO_INCREMENT, 
NAME VARCHAR(40), 
CONTACT_INFO INT, 
KEY `CONTACT_INFO` (`CONTACT_INFO`), 
CONSTRAINT `fk_student_contact_info` FOREIGN KEY (`CONTACT_INFO`) REFERENCES `cont_info` (`ID`) 
); 

實體:

ContactInfo.java

import java.io.Serializable; 

public class ContactInfo implements Serializable { 

    private int id; 
    private String mobileNo; 
    private String emailId; 
    private Student student; 

    public Student getStudent() { 
     return student; 
    } 
    public void setStudent(Student student) { 
     this.student = student; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getMobileNo() { 
     return mobileNo; 
    } 
    public void setMobileNo(String mobileNo) { 
     this.mobileNo = mobileNo; 
    } 
    public String getEmailId() { 
     return emailId; 
    } 
    public void setEmailId(String emailId) { 
     this.emailId = emailId; 
    } 

} 

Student.java:

import java.io.Serializable; 

public class Student implements Serializable { 
    private int id; 
    private String name; 
    private ContactInfo contactInfo; 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public ContactInfo getContactInfo() { 
     return contactInfo; 
    } 
    public void setContactInfo(ContactInfo contactInfo) { 
     this.contactInfo = contactInfo; 
    } 
} 

HBM :

<class name="com.tutorial.hibernate.ContactInfo" table="cont_info"> 
    <id column="id" name="id"> 
     <generator class="identity" />   
    </id> 
    <one-to-one name="student" class="com.tutorial.hibernate.Student" cascade="save-update"></one-to-one> 
    <property name="mobileNo" column="MOBILE_NO" /> 
    <property name="emailId" column="EMAIL_ID" /> 
</class> 

<class name="com.tutorial.hibernate.Student" table="student"> 
    <id name="id" column="id">   
     <generator class="foreign"> 
      <param name="property">contactInfo</param> 
     </generator> 
    </id> 
    <one-to-one name="contactInfo" class="com.tutorial.hibernate.ContactInfo" constrained="true"></one-to-one> 
    <property name="name" column="NAME" />  
</class> 

Java代碼來挽救實體:上述行執行時

Session session = HibernateUtil.getSession(); 
Transaction txn = session.beginTransaction(); 

ContactInfo contactInfo = new ContactInfo(); 
contactInfo.setMobileNo("9876543212"); 
contactInfo.setEmailId("[email protected]"); 

Student student = new Student(); 
student.setName("Student1"); 
contactInfo.setStudent(student); 

student.setContactInfo(contactInfo); 
session.save(student); 

txn.commit(); 
session.close(); 

我可以請參閱SQL等。

Hibernate: insert into cont_info (MOBILE_NO, EMAIL_ID) values (?, ?) 
Hibernate: insert into student (NAME, id) values (?, ?) 

但實際上表所示。

contact_info enter image description here

+0

請參閱我的編輯anwser。 – NPKR 2013-03-04 07:26:09

回答

0

這是在你的代碼的映射文件造成的問題

generator class="foreign" 

嘗試使用這個student映射文件一樣contact_info映射文件

<id column="id" name="id"> 
     <generator class="identity" />   
    </id> 

編輯在學生映射文件需要提及列名

<one-to-one name="contactInfo" class="com.tutorial.hibernate.ContactInfo" constrained="true" column="CONTACT_INFO"></one-to-one> 
+0

已經嘗試過。但它不起作用。 – Mohan 2013-03-04 07:17:43

+0

我們沒有「一對一」映射標籤中的「列」屬性。 – Mohan 2013-03-04 07:33:16