`
p_3er
  • 浏览: 55738 次
  • 性别: 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会初始化这些代理.

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


分享到:
评论

相关推荐

    9 映射-- 一对一(两种)(人与身份)

    例如,一个人与他的身份证之间就是典型的一对一关系,一个人只有一个身份证号,而一个身份证号也只对应一个人。 2. **外键约束实现一对一**:第一种实现方式是通过外键约束。在Hibernate中,我们可以使用`@OneToOne...

    Hibernate关联关系映射目录

    在一对一主键单向关联中,两个实体共享同一个主键。这种方式通常用于当两个实体之间存在着紧密联系,以至于其中一个实体的生命周期依赖于另一个实体时。 **表结构示例**: - **Person表**: - `personid`: 主键 - ...

    答案《关系数据库与SQL语言》第一章练习题.pdf

    《关系数据库与SQL语言》第一章练习题主要涵盖了数据库的基础概念、数据模型、关系数据库的关键特性以及SQL语言的相关知识。以下是对这些知识点的详细说明: 1. **实体完整性**:实体完整性是关系数据库的一个核心...

    答案《关系数据库与SQL语言》第一章练习题.doc

    16. 公司中有多个部门和多名职员,每个职员只能属于一个部门,一个部门可以有多名职员,从部门到职员的联系类型是一对多。 17. 现有如下关系:职工(职工号、姓名、性别、职务),部门(部门编号、部门名称、职工号...

    数据库基础与实践技术(SQL server 2008)第一章习题

    【数据库基础与实践技术(SQL server 2008)第一章习题】 1. 区分不同实体的依据是( )。 实体在数据库中通常指的是具有独立特性的对象,例如人员、产品等。区分不同实体的依据是它们的属性。属性是描述实体特征的...

    hibernate开发与实战 源代码

    4. **Chapter 09 - 一对一(1 to 1)共享主键**:在数据库中,两个表之间可能存在一对一关系,且它们共享相同的主键。这里会解释如何使用Hibernate来实现这种关系,并展示相应的映射配置。 5. **Chapter 10 - 多对多...

    hibernate 3.3 源码

    这些映射定义了字段之间的对应关系,如主键生成策略、关联关系(一对一、一对多、多对多)等。 4. **会话工厂(SessionFactory)** SessionFactory是线程安全的,负责创建会话实例。它是Hibernate的核心组件,初始...

    hibernate应用开发完全手册(源码)

    9. **实体关系映射**:包括一对一、一对多、多对一、多对多等各种关系的映射,以及联合主键、外键约束等高级映射技巧。 10. **性能调优**:通过合理设置缓存策略、批处理、连接池等方式,可以显著提升Hibernate应用...

    Hibernate帮助文档

    8. **关联映射**:Hibernate支持一对一、一对多、多对一和多对多等多种关联映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解来实现。 9. **性能优化**:包括延迟加载(Lazy Loading)、集合分页、...

    Hibernate3.3_学习笔记.doc.zip

    Hibernate支持多种关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。理解这些关系如何在映射文件中配置,并能在实际项目中灵活运用,是提升开发效率的关键。 七...

    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 扩展持久...

    hibernate中文参考文档

    Hibernate支持多种对象关系映射策略,如一对一、一对多、多对一、多对多。这些映射关系通过注解或HBM文件定义,使得Java对象间的复杂关系能够平滑地转化为数据库中的关系模型。 九、Cascading与Lazy Loading ...

    hibernate项目开发

    Hibernate支持多种关联关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。正确配置关联关系,可以实现对象间的导航访问,简化数据操作。 九、缓存机制 Hibernate...

    Manning - Java Persistence With Hibernate.pdf

    6. 关联映射:Hibernate支持一对一、一对多、多对一和多对多四种关联关系。通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解来定义关联,同时可以配置级联操作、懒加载和fetch策略。 7.缓存机制:Hibernate...

    hibernate3.2中文参考手册

    Hibernate 支持各种关联关系,包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。通过配置,可以实现双向关联、懒加载、集合元素的级联操作等高级特性。 九、性能优化 在...

    Hibernate2 参考文档

    Hibernate2 支持一对一、一对多、多对一和多对多的引用关系。通过在映射文件中定义这些关系,Hibernate 自动处理关联对象的保存和加载。 **10. 懒加载和立即加载** 懒加载(Lazy Loading)是 Hibernate2 的一种优化...

    MyBatis 常见面试题总结.zip

    通过ResultMap的association和collection元素,结合主键外键关系,实现一对一和一对多的映射。 12. **MyBatis的、、、标签有何作用?** 这些标签用于构建动态SQL,判断条件,类似switch语句,为case,为default。...

    Hibernate src

    9. **关联映射**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)四种关系映射,使Java对象之间的关系能够准确地反映到数据库表的关联上。 10. **事件监听器**:...

    Hibernate教程

    Hibernate支持多种对象关系映射,包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些关系的映射需要在实体类中正确配置,并在映射文件或注解中声明。 通过本教程...

    HIBERNATE符合Java习惯的关系数据库持久化

    级联操作允许我们在对一个对象进行操作(如保存、更新或删除)时,自动处理其关联的对象。 8. **缓存机制**:为了提升性能,Hibernate引入了缓存机制。一级缓存是Session级别的,所有在Session中的对象都会被缓存。...

Global site tag (gtag.js) - Google Analytics