在外键中休眠一对一

问题描述:

我正试图与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_infoenter image description here

+0

请参阅我的编辑anwser。 – NPKR 2013-03-04 07:26:09

这是在你的代码的映射文件造成的问题

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