Hibernate 以外键关联

以学生(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=?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值