hibernate关系映射(一对一)

一对一关联分为外键关联和主键关联:外键关联是指从表中存在主表的外键,这也是一种特殊的多对一关系;主键关联是指主从表的id一致

外键关联

主表:IDCard(校园卡)

从表:Student(学生)

学生类的定义和hbm文件的配置如下

1 public class Student {
2     private int id;
3     private String name;
4     //持有idcard的外键
5     private IDCard idCard;
6 } 

可以看到 学生持有校园卡外键的类结构和之前多对一关系中持有年级表外键的类结构是一样的,所以配置hbm的时候也可以看成学生和校园卡是多对一关系,只是多的一方现在只有一个而已

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Student" table="student">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" type="java.lang.String">
12             <column name="name" length="50" />
13         </property>
14         <many-to-one name="idCard" column="idcardid" unique="true" cascade="all"></many-to-one>
15     </class>
16
17 </hibernate-mapping>

校园卡类的定义和hbm文件的配置如下

1 public class IDCard {
2     private int id;
3     private String num;
4     private Student student;
5 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.IDCard" table="idcard">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="num"></property>
12
13         <one-to-one name="student"></one-to-one>
14     </class>
15
16 </hibernate-mapping>

测试程序

 1 public class HibernateTest {
 2     public static void main(String[] args) {
 3         Session session = HibernateFactory.currentSession();
 4         Transaction tx = session.beginTransaction();
 5
 6
 7         Student student = new Student();
 8         student.setName("student");
 9
10         IDCard idCard = new IDCard();
11         idCard.setNum("109029055");
12
13         student.setIdCard(idCard);
14
15         //student配置了级联,存储了student也会把关联的idcard存储进去
16         session.save(student);
17 //        session.save(idCard);
18
19         tx.commit();
20         session.close();
21
22     }
23 }

结果

主键关联

学生

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.Student" table="student">
 7         <id name="id" column="id">
 8             <generator class="increment"></generator>
 9         </id>
10
11         <property name="name" type="java.lang.String">
12             <column name="name" length="50" />
13         </property>
14         <one-to-one name="idCard" cascade="all"></one-to-one>
15     </class>
16
17 </hibernate-mapping>

校园卡

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping >
 6     <class name="com.zlt.hibernatedemo.IDCard" table="idcard">
 7         <id name="id" column="id">
 8             <generator class="foreign">
 9                 <param name="property">student</param>
10             </generator>
11         </id>
12
13         <property name="num"></property>
14
15          <!-- 若constrained=true,则表明存在外键与关联表对应,且关联表中肯定存在对应的键与其对应。-->
16         <one-to-one name="student" cascade="all" constrained="true"></one-to-one>
18     </class>
19
20 </hibernate-mapping>

测试程序

 1 public class HibernateTest {
 2     public static void main(String[] args) {
 3         Session session = HibernateFactory.currentSession();
 4         Transaction tx = session.beginTransaction();
 5
 6
 7         Student student = new Student();
 8         student.setName("student");
 9
10         IDCard idCard = new IDCard();
11         idCard.setNum("109029055");
12
13
14         //必须执行此语句
15         idCard.setStudent(student);
16
17         session.save(idCard);
18
19         tx.commit();
20         session.close();
21
22     }
23 }

结果

constrained(one-to-one):

constrained默认值为false

constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应, 另外该选项最关键的是影响save和delete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。 删除的时候反之。

one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。

one-to- one的双向关联中,必须设置constrained=true,要不然会有重复数据读,如2个表user,car;在位false时sql下:select * from user a left outer join car b on a.id=b.id left outer join on user c on a.id=c.id where a.id=? 删除的时候最好删除从表,删除主表会先查询下主表,在联合查询下

hibernate关系映射(一对一)

时间: 2024-08-26 07:59:09

hibernate关系映射(一对一)的相关文章

浅谈Hibernate关系映射(2)

继上篇博客 一对一关系映射:一对一关联映射在实际生活中是比较常见的,如人与身份证的关系,通过人这个对象可以找到他相关的内容. 一对一单向(主键): 单向一对一主键关联,靠的是它们的主键相等,从Person中能看到IdCard,也就是把t_idCard中的主键拿过来当做t_Pseron的主键. 如图的线表示一个关联,在person中可以看见idcard.即在person中持有idCard的引用 person类的映射关系 <hibernate-mapping> <class name=&qu

Hibernate关系映射基础

1.  Hibernate关系映射基础 1.1.  Doctype <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 指定根元素和dtd文件的命名空间. 1.2.  hibernate-mapping <hiberna

Java学习笔记-Hibernate关系映射

1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1(多对一,一对多): http://www.cnblogs.com/zilong882008/archive/2011/11/05/2236559.html 3. Hibernate关联映射 http://www.cnblogs.com/huxi/archive/2009/12/15/1624988.

hibernate 关系映射文件配置

<!--Department.hbm.xml users属性,本类与User的一对多 --> <set name="users"> <key column="departmentId"></key> <one-to-many class="User" /> </set> <!-- parent属性,本类与Department(上级)的多对一 --> <man

浅谈Hibernate关系映射(3)

继上篇博客 一对多关联映射(单向) 上面我们介绍了多对一,我们反过来看一对多不就是多对一吗?那还用再进行不同的映射吗?有什么差别吗?一对多和多对一映射原理是一致的,存储是相同的,也就是生成的数据库的表是一样的,他们之间不同的是维护的关系不同. 他们之间不同点是维护的关系不同 *多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来. *一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来. 一个班级有多个学生,通过班级可以看到学生信息. Class

浅谈Hibernate关系映射(4)

继上篇博客 多对多关联映射(单向) 多对多对象关系映射,需要加入一张新表完成基本映射. Hibernate会自动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的. 如下图所示 通过User可以查看Role的信息 User的映射文件 <hibernate-mapping> <class name="com.bjpowernode.hibernate.User"> <

hibernate关系映射(多对多)

多对多关系(学生Student,课程Course) 学生类的定义以及hbm文件的配置如下 1 public class Student { 2 private int id; 3 private String name; 4 private Set<Course> courses = new HashSet<Course>(); 5 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <

hibernate关系映射(多对一)

对多一关系是最普遍也是最重要的一种对象关系,其中又包括了单向的多对一,单向的一对多以及双向的多对一关系 单向多对一 多的一方:学生(Student) 一的一方:班级(Grade) 班级类的定义以及hbm文件配置如下 1 public class Grade { 2 private int id; 3 private String name; 4 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTY

Hibernate关系映射(二) 基于外键的双向一对一

基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 Account.cs,需要添加被控端的引用 package com.lxit.entity; import java.io.Serializable; public class Account implements Serializable{ public Account(){ } private int