`
p_3er
  • 浏览: 52580 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

第九章 关系映射 一对一关系 共享主键方式实现一对一

 
阅读更多

如:person与idCard

idcard中的id作为主键又作为一个引向person的外键。person作为主表,idcard作为从表。

Person:

public class Person implements Serializable{
	private Integer id;
	private String name;
	private IdCard idCard;

	public Person() {
	}
	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public IdCard getIdCard() {
		return idCard;
	}

	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}

	
}


IdCard:

public class IdCard {
	private Integer id;
	private String cardNo;
	private Person person;
	
	public IdCard(){
	}
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}

	public Person getPerson() {
		return person;
	}
	
	public String getCardNo() {
		return cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}

	public void setPerson(Person person) {
		this.person = person;
	}
}


Person.hbm.xml:

<hibernate-mapping>
    <class name="cn.framelife.hibernate.entity.Person"    table="person" catalog="hibernate">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <one-to-one name="idCard" class="cn.framelife.hibernate.entity.IdCard"></one-to-one>
        <property name="name" type="java.lang.String">
            <column name="name" length="45" not-null="true" />
        </property>
    </class>
</hibernate-mapping>


IdCard.hbm.xml:

<hibernate-mapping>
	<class name="cn.framelife.hibernate.entity.IdCard" table="id_card"
		catalog="hibernate">
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<generator class="foreign">
				<param name="property">person</param>
			</generator>
		</id>
		<property name="cardNo" type="java.lang.String">
			<column name="card_no" length="45" not-null="true" />
		</property>

		<!-- constrained="true", 表明当前主键上存在一个约束-->
		<one-to-one name="person" constrained="true"
			class="cn.framelife.hibernate.entity.Person"></one-to-one>
	</class>
</hibernate-mapping>


增加操作:

 Person person = new Person();
			person.setName("zhang");
			
			IdCard idCard = new IdCard();
			idCard.setCardNo("11111111");
			
			idCard.setPerson(person);
			
			
              //在保存idCard的时候会保存person
	     session.save(idCard);  //2


查询操作:

根据主表得到从表信息。查询主表的时候,通过一次连接查询查出两张表中所需要的数据。

Person person = (Person) session.get(Person.class, 1);
              System.out.println("-----------");
		System.out.println(person.getIdCard().getCardNo());

控制台信息:

Hibernate: select person0_.id as id2_1_, person0_.name as name2_1_, idcard1_.id as id1_0_, idcard1_.card_no as card2_1_0_ from hibernate.person person0_ left outer join hibernate.id_card idcard1_ on person0_.id=idcard1_.id where person0_.id=?
--------------
11111111


根据从表得到主表信息。查询从表的时候,是先查从表数据,在使用到主表的对象的时候,再查询主表。

IdCard idCard = (IdCard) session.get(IdCard.class, 1);
			System.out.println("-----------");
			System.out.println(idCard.getPerson().getName());


控制台信息:

Hibernate: select idcard0_.id as id1_0_, idcard0_.card_no as card2_1_0_ from hibernate.id_card idcard0_ where idcard0_.id=?
-----------
Hibernate: select person0_.id as id2_1_, person0_.name as name2_1_, idcard1_.id as id1_0_, idcard1_.card_no as card2_1_0_ from hibernate.person person0_ left outer join hibernate.id_card idcard1_ on person0_.id=idcard1_.id where person0_.id=?
zhang




one-to-one(元素)懒加载分析:

必须同时满足下面的三个条件时才能实现懒散加载:

1).lazy!=false (lazy缺省方式就!=false,lazy是=proxy)

2).constrained=true

3).fetch=select(fetch缺省方式即为select)

因为主表不能有constrained=true,所以主表没有懒加载功能。能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)时,hibernate会初始化这些代理,当相关联的session关闭后,再访问懒加载的对象将会出现异常。

根据从表得到主表信息的查询中,查询从对象IdCard时实现了懒加载功能,因为它只查询了IdCard对象,而关联的Person对象它没有进行查询。在使用到Person的时候,将IdCard关联的Person对象也进行了查询。因为访问这些懒加载对象(代理对象)的属性(getId和getClass除外)时,hibernate会初始化这些代理.

在数据量过多过大的时候,不适合使用缓存时,应该使用懒加载。


分享到:
评论

相关推荐

    Hibernate实战(第2版 中文高清版)

     第9章 使用对象   9.1 持久化生命周期   9.1.1 对象状态   9.1.2 持久化上下文   9.2 对象同一性和等同性   9.2.1 引入对话   9.2.2 对象同一性的范围   9.2.3 脱管对象的同一性   9.2.4 扩展持久...

    J2EE中文版指南 CHM格式 带全文检索

    一对一关系 81 运行StorageBinApp应用程序 83 一对多关系 84 将子表实现为辅助类 84 运行OrderEJB应用程序 87 将子表实现为实体Bean 87 运行SalesRepEJB的例子 90 多对多关系 90 运行EnrollerEJB的例子 91 四.BMP的...

    《数据库原理与应用》复习.doc

    13. 关于关系模式 R(U)、候选键 k、主键 p:R(U)的任何一个关系实例的任意两个元组在属性集合 k 上的值都不相同;k 的任何真子集都不满足条件;pk;在一个关系模式中,主键 p 只有一个,而候选键 k 可有多个,因此...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    第一章 绪论 1.1. 选题背景 这几年,许多新名词涌入我们的视野:博客、圈子、播客、WAP等。这些都预示着我们进入了一个新的互联网阶段web 2.0,它是相对web 1.0的新的一类互联网应用的总称,是一次从核心内容到外部...

    java源码包---java 源码 大量 实例

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    JAVA上百实例源码以及开源项目

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    JAVA上百实例源码以及开源项目源代码

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    Access 2000数据库系统设计(PDF)---001

    1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 ...

    Access 2000数据库系统设计(PDF)---002

    1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 ...

    Access 2000数据库系统设计(PDF)---018

    1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 ...

    Access 2000数据库系统设计(PDF)---003

    1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 ...

    Access 2000数据库系统设计(PDF)---011

    1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 ...

    Access 2000数据库系统设计(PDF)---020

    1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 ...

    Access 2000数据库系统设计(PDF)---009

    1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 ...

    java源码包2

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    Oracle8i_9i数据库基础

    第九章 安全管理 203 §9.1 CREATE USER 命令 203 §9.2 建立用户 204 §9.2.1 外部验证(Authenticated )用户 204 §9.2.2 全局(Globally)验证用户-企业验证 204 §9.3 ALTER USER 命令 205 §9.4 DROP USER 命令 ...

    数据库基础

    第九章 安全管理 203 §9.1 CREATE USER 命令 203 §9.2 建立用户 204 §9.2.1 外部验证(Authenticated )用户 204 §9.2.2 全局(Globally)验证用户-企业验证 204 §9.3 ALTER USER 命令 205 §9.4 DROP USER 命令 ...

    java源码包3

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

Global site tag (gtag.js) - Google Analytics