休止状態のエンティティで「1 対 1」のマッピングを実行しようとしています。student テーブルには、外部キー参照として 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("test@gmail.com");
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 (?, ?)
しかし、実際には表が示しています。