以学生(STUDENT)和身份证(CARD)为例子:
建表语句:
Student:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`ID` int(11) NOT NULL auto_increment,
`Name` varchar(255) default NULL,
`TeamID` int(11) default NULL,
PRIMARY KEY (`ID`),
KEY `F_Team` (`TeamID`),
CONSTRAINT `F_Team` FOREIGN KEY (`TeamID`) REFERENCES `team` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=gbk;
Card:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for card
-- ----------------------------
DROP TABLE IF EXISTS `card`;
CREATE TABLE `card` (
`ID` int(11) NOT NULL auto_increment,
`Name` varchar(255) default NULL,
`StudentID` int(11) default NULL,
PRIMARY KEY (`ID`),
KEY `F_Student` (`StudentID`),
CONSTRAINT `F_Student` FOREIGN KEY (`StudentID`) REFERENCES `student` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=gbk;
配置文件:
Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.vo.Student" table="student" catalog="test" batch-size="3">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" >
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="Name" />
</property>
<one-to-one name="cardID" class="com.vo.Card" cascade="all" fetch="join"></one-to-one>
</class>
</hibernate-mapping>
Card.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.vo.Card" table="card" catalog="test">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="Name" />
</property>
<many-to-one name="student" column="StudentID" class="com.vo.Student" unique="true"></many-to-one>
</class>
</hibernate-mapping>
红色字体部分:以外键关联的一对一,本质上变成了一对多的双向关联,最后再many-to-one这一边加上unique=true表示他是一对多的特列。
客户端:
public static void main(String[] args) {
Session session = SessionUtil.getSession();
Transaction tran = session.beginTransaction();
Student stu = new Student();
stu.setName("BOSS");
Card card = new Card();
card.setName("身份证BOSS");
stu.setCardID(card);
card.setStudent(stu);
session.save(stu);
tran.commit();
session.close();
}
one-to-one 默认的级联关系为预先抓取
Student stu = (Student)session.get(Student.class,36 );
打印:
Hibernate: select student0_.ID as ID1_2_, student0_.Name as Name1_2_, student0_.TeamID as TeamID1_2_, team1_.ID as ID0_0_, team1_.Name as Name0_0_, card2_.ID as ID2_1_, card2_.Name as Name2_1_, card2_.StudentID as StudentID2_1_ from test.student student0_ left outer join test.team team1_ on student0_.TeamID=team1_.ID left outer join test.card card2_ on student0_.ID=card2_.ID where student0_.ID=?
如果想改成延迟加载:
1.在student.hbm.xml
加上constrained="true"
<one-to-one name="cardID" class="com.vo.Card" cascade="all" constrained="true"></one-to-one>
2.
加上lazy=true,lazy=proxy
card.hbm.xml
<class name="com.vo.Card" table="card" catalog="test" lazy="true">
<many-to-one name="student" column="StudentID" class="com.vo.Student" unique="true" lazy="proxy"></many-to-one>
重新运行代码打印:
Hibernate: select student0_.ID as ID1_0_, student0_.Name as Name1_0_ from test.student student0_ where student0_.ID=?