`
369540808
  • 浏览: 196528 次
文章分类
社区版块
存档分类
最新评论

ORM框架Hibernate (四) 一对一单向、双向关联映射

 
阅读更多
  1. 简介
    1. 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一、又如一夫一妻制等等。
    2. 记得在Java编程思想上第一句话是“一切皆对象”,生活中的所有事物都是对象,这种一一对应的关系也体现在了对象上,但是在对象上有了些区别这和对象的特性有关系,有了方向性,拿人和身份证来说他们是两个对象,如果是单一方向那么知道了人的信息就能知道身份证信息,相反却得不到。
    1. 从实现角度来分也可以分为两种情况,第一种是共享主键;第二种是唯一外键;这两种都很好理解,我们做的系统也不少了平时我们用的那种就是属于唯一外键约束,共享主键是那其中一个表的主键另一个表来用,两个表使用一个相同的主键来保持两个表中记录一一对应。
  1. 共享主键方式实现
    1. 在维持一对一映射中这种方式用的比较少,可能对于数据库的性能有所提高不需要外键来约束,我们拿人和身份证来说说这种方式怎么实现一对一映射,下面是这两个类的对应关系。
    2. 类图
    1. Person实体类
      1. package com.bjpowernode.hibernate;
        /**
         * a person information
         * @author LLS
         *
         */
        public class Person {
        	//class's properties
        	private int id;
        	private String name;
        	private Card card;
        	//getter and setter method
        	public Card getCard() {
        		return card;
        	}
        	public void setCard(Card card) {
        		this.card = card;
        	}
        	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;
        	}
        }
        

    1. Card实体类
      1. package com.bjpowernode.hibernate;
        /**
         * a identity card 
         * @author LLS
         *
         */
        public class Card {
        	//class properties
        	private int id;
        	private String cardNo;
        	//getter and setter method
        	public int getId() {
        		return id;
        	}
        	public void setId(int id) {
        		this.id = id;
        	}
        	public String getCardNo() {
        		return cardNo;
        	}
        	public void setCardNo(String cardNo) {
        		this.cardNo = cardNo;
        	}
        	
        }
        

    1. Person映射文件
      1. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Person" table="t_person">
        		<id name="id">
        			<!-- 采用foregin策略,它会取得关联对象的标识 -->
        			<generator class="foreign">
        				<!-- property只关联对象 -->
        				<param name="property">card</param>
        			</generator>
        		</id>  
        		<property name="name"></property>
        		<!-- 
        		one-to-one指示Hibernate如何加载其关联对象,默认根据主键加载,也就是拿到了关联字段
        		根据对端的主键来加载。
        		constrained="true"表示当前主键还是一个外键,也就是会生成外键约束语句,当前主键对引用表来说是一个
        		外键,但对当前表是主键
        		 -->
        		<one-to-one name="card" constrained="true"></one-to-one>
        
        	</class>
        </hibernate-mapping>

    1. Card映射文件
      1. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Card" table="t_card">
        		<id name="id">
        			<generator class="native"></generator>
        		</id>
        		<property name="cardNo"></property>
        	</class> 
        </hibernate-mapping>

    1. 上面是从人到身份证的单向对应关系,如果想实现双向只需在Card类中加入对Person类的引用。另外每个代码中用到的重要属性都做了详细注释,可以参考注释看代码。
  1. 唯一外键约束
    1. 单向关联(从PersonCard
      1. 还拿上面两个实体类举例代码基本同上面相同,上面已经写的很详细,不同的地方只是Person的映射文件有所区别,在里面加入了几个属性。
      2. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Person" table="t_person">
        		<id name="id">
        			<generator class="native">	
        			</generator>
        		</id>  
        		<property name="name"></property>
        		<!-- 
        			这里面代码同上一篇博客,多对一映射代码相同,所不同的是加入了unique属性来限制只能是
        			一对一。
        		 --> 
        		<many-to-one name="card" column="cardId" unique="true"></many-to-one>
        	</class>
        </hibernate-mapping>

      3. 当你看到后是不是觉得和多对一映射关系很像呢,其实,它就是多对一的一种特殊情况也是就是多对一包括了一对一这种情况,我们通过加入了unique属性限制只能为一对一,多对一就成了一对一了。
    1. 双向关联
      1. Card实体以及映射文件中做了一些改动,如下:
      1. Card实体中加入了对Person的引用
      2. package com.bjpowernode.hibernate;
        
        public class Card {
        	private int id;
        	private String cardNo;
        	//加入了对person对象的引用
        	private Person person;
        
        	//…………………………同上
        	//…………………………同上
        }

      3. Card映射文件
      4. <?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC 
        	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        <hibernate-mapping >
        	<class name="com.bjpowernode.hibernate.Card" table="t_card">
        		<id name="id">
        			<generator class="native"></generator>
        		</id>
        		<property name="cardNo"></property>
        		<!-- PS -->
        		<!-- property-ref指定对应哪个表的列,如果不设置该属性则默认参照表的主键
        			在person表中的cardId列是参照Card表生成的,反过来,Card表必须也对应cardId列,
        			才能确保一对一关系,但是呢,默认情况会选择参照person表主键,所以,这里加入了property-ref
        			属性来限制一下,参照person表的哪个属性。
        		-->
        		<one-to-one name="person" property-ref="card"></one-to-one>
        	</class> 
        </hibernate-mapping> 

  1. 一对一关联是一种重要的对应关系,尤其是唯一外键约束必须理解和学会运用,在实际开发中这种对应关系可能会更复杂需要根据业务去分析,但原理都是一样的理解了这个对于别的也会轻松上手。
分享到:
评论

相关推荐

    详解Hibernate一对一映射配置

    个人的很详细的Hibernate一对一映射配置详解,对初学者有帮助!

    ORM映射关系配置

    实现Hibernate框架中一对一,一对多,多对多关系的单向和双向配置总结!

    Hibernate_实体关联关系映射--学习总结

    Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚

    eshop1.0(ssh电子商城)

    8.配置会员到订单的一对多双向关联关系 9.配置会员到留言的一对多单向关联关系 10.配置管理员到留言的一对多单向关联关系 11.配置会员到购物车的一对多单向关联关系 12.配置订单到购物车的一对一单向关联关系 13....

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、...

    精通Hibernate:对象持久化技术第二版part3

    7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.4 映射一对一关联关系 228 4.3.5 映射多对一单向关联关系 235 4.3.6 映射一对多双向关联关系 239 4.3.7 映射一对多双向自身关联关系 244 4.3.8 映射多对多单向关联关系 247 4.3.9 映射多对多双向关联关系 ...

    Pro JPA 2 Mastering the Java Persistence API free down

    ORM 映射增强特性,包括:支持通过使用 @ElementCollection 标注来增强 collections, maps 和 lists( 这里不是指实体之间的关联关系 ) 集合,支持 map 的单向 one-to-many 关联 (JPA1.0 只允许双向 one-to-many ...

    Spring面试题

    1.使用双向一对多关联,不使用单向一对多 2.灵活使用单向一对多关联 3.不用一对一,用多对一取代 4.配置对象缓存,不使用集合缓存 5.一对多集合使用Bag,多对多集合使用Set 6. 继承类使用显式多态 7. 表字段要少,表...

    jdbc基础和参考

    一般在做双向多对一(一对多)关联关系映射的时候,一般会设置让一的一方放弃对关联关系的维护,以减少不必要的更新语句 一对一: 基于外键的一对一 Wife Husband id id name name h_id references Husband...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.5.9 对关联实体进行排序 424 10.6 继承关系映射 426 10.6.1 整个类层次对应一张表的 映射策略 427 10.6.2 连接子类的映射策略 430 10.6.3 每个具体类对应一张表的 映射策略 434 10.7 使用抽象实体和非实体父类 ...

Global site tag (gtag.js) - Google Analytics