步骤一,建立Person类及相关的实体配置文件。
package com.asm.hibernate.domain;
public class Person {
private int id;
private String name;
private IdCard idCard;
...省略相应的get/set方法。
}
配置文件:person.hbm.xml 和前面的配置一样,只需要留意下</one-to-one>元素,内容如下:
<hibernate-mapping package="com.asm.hibernate.domain">
<class name="Person">
<id name="id">
<generator class="native" />
</id>
<property name="name"></property>
<one-to-one name="idCard"></one-to-one>
</class>
</hibernate-mapping>
>>步骤二,建立IdCard类及相关的实体配置文件。
package com.asm.hibernate.domain;
import java.util.Date;
public class IdCard {
private int id;
private Date validity;
private Person person;
...省略相应的get/set方法。
}
从表配置文件:IdCard.hbm.xml ,内容如下:
<hibernate-mapping package="com.asm.hibernate.domain">
<class name="IdCard">
<id name="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="validity"></property>
<one-to-one name="person" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
配置文件说明:由于上面提到的是采取主键关联,即是说这里的id即是主键,同时也是(关联相关表的)外键,因此,以下对id的生成采取了”foreign”方式,其实这种方式也就指明了主键同时为外键。下面的<param>指定了外键的参考信息,此元素中的内容指明了它参考<one-to-one>的person。 注意在<one-to-one name="person" constrained="true">中设定了constrained属性,其作用是说明该配置文件所映射表的主键同时作为外键,参照关联类对应表的主键。设定了此属性可用“show create table idcard”查看表idcard的定义发生了变化。
>>步骤三,修改主配置文件,关联上面的实体配置文件。
>>步骤四,编写测试类,OneToOneTest.java 内容如下:省略导入的包。
package com.asm.hibernate.test;
public class OneToOneTest {
public static void main(String[] args) {
add();
}
static void add() {
Session s = null;
Transaction tr = null;
try {
s = HibernateUtil.getSession();
tr = s.beginTransaction();
Person person = new Person();
person.setName("pName");
IdCard idCard = new IdCard();
idCard.setValidity(new Date());
//分别注释掉以下两句,看程序执行情况
person.setIdCard(idCard);
idCard.setPerson(person);
s.save(person);
s.save(idCard);
tr.commit();
} finally {
if (s != null)
s.close();
}
}
}
说明:留意上面的注释,如果注释掉第一句,发现一切正常,因为主对象是可以没有此属性,它的实体配置文件也基本与前面一样。而如果注释掉下面一句,将会报错,原因是“attempted to assign id from null one-to-one property: person”,IdCard的实体配置文件关联了一个表,而它采取主键关联,而主键关联要依赖于person属性的id,如果这里注释掉,即没有了此属性,它也关联不了相应的id。简单的说,IdCard来要关联Person,我们称它为从对象,而person并不关联谁,我们称为主对象。现在只要记住,从对象关联了表(关联了主对象),必须设定它所关联的主对象属性
>>步骤五,编写两个查询方法,一个查询主对象,主要代码:
static Person query(int id) {
Session s = null;
Transaction tr = null;
try {
s = HibernateUtil.getSession();
tr = s.beginTransaction();
Person p = (Person) s.get(Person.class, id);
System.out.println("身份证有效期:" + p.getIdCard().getValidity());
tr.commit();
return p;
} finally {
if (s != null)
s.close();
}
}
然后再在main方法中调用此方法,并开启控制台数据库库语言显示后,可以从控制台看出查询主对象只select一次;再增加一个查询从对象的方法,主要代码:
static IdCard query2(int id) {
Session s = null;
Transaction tr = null;
try {
s = HibernateUtil.getSession();
tr = s.beginTransaction();
IdCard idCard = (IdCard) s.get(IdCard.class, id);
//System.out.println("人的名字:" + idCard.getPerson().getName());
//去掉上一句注释后,发现会查询两次。
tr.commit();
return idCard;
} finally {
if (s != null)
s.close();
}
}
同样在main方法中调用此方法,并开启控制台数据库库语言显示后。从控制台看出也只会查询一次,但是如果去掉注释后发现会查询两次。 接着,在此例的基础上修改成外键关联。
外键关联:从表的主键并不作为外键参考主表的主键,而是将其它字段作为外键参的主键。
其实在上例的基础上,我们只需要修改IdCard.hbm.xml配置文件即可,修改后的内容如下:
<hibernate-mapping package="com.asm.hibernate.domain">
<class name="IdCard">
<id name="id">
<generator class="native" />
</id>
<property name="validity"></property>
<many-to-one name="person" column="person_id" unique="true" />
</class>
</hibernate-mapping>
说明:由于采取了外键关联,所以这里的从表的主键将不再作为外键参考主表的主键,所以它会采取一般的方式生成主键,即<id>生成和以前的那此相同采取“native”方式。 另注意到< many-to-one >,发现增加了unique有属性,这样尽管是多对一,但能有效保证实质是一对一。 这时运行原OneToOneTest,发现仍是和以前一样。 如果我们再修改Person的实体配置文件<one-to-one>如下:
<one-to-one name="idCard" property-ref="person"/> 特别要注意到property-ref 属性。可以结合执行后表的结构来看。其实如果注释掉此句,其结果就是通过身份证可以查看到Person的相关信息,但是通过Person却不能找到身份证信息,因为Hibernate完全依赖实体配置文件(映射文件)。注释掉当然就不能找到。而事实上这时在OneToOne中调用query方法,会发现出现空指针异常。其实在前面的关联关系中,最终都是实现了双向关联,而这里如果注释掉此句,正好成了单向关联的一个例证。
相关推荐
标题"hibernate入门一:单表操作(单对象操作)"表明这篇文章主要介绍的是Hibernate框架的基础使用,特别是针对数据库单表的简单操作,如增删改查,以及如何处理单个数据库对象。描述部分为空,但通常这样的教程会...
【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...
**初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。
【hibernate入门--第一个实例】 Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务。通过使用Hibernate,我们可以将数据库操作转换为对Java对象的操作,从而简化了数据库...
Hibernate 支持多种对象关系映射,如一对一、一对多、多对一、多对多。例如,一个User可以有多个Order: ```xml <!-- User.hbm.xml --> <!-- Order.hbm.xml --> ``` 以上就是Hibernate入门的基础内容。...
13. **一对多、多对一、一对一关系映射**:理解如何在实体类间建立这些关联关系,并在映射文件或注解中进行配置。 14. **集合映射**:例如List、Set、Map等集合类型的字段与数据库表的关联映射。 15. **懒加载和...
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
最后,书中可能会涵盖一些高级主题,如多对一、一对多、多对多的关系映射,以及继承映射、复合组件、查询优化等。这些内容都是Hibernate深入学习的重点,对于理解和掌握复杂的数据模型以及高效的数据操作至关重要。 ...
《Beginning Hibernate: For Hibernate 5》是一本非常适合 Java 开发者入门 Hibernate 的书籍。它不仅覆盖了 Hibernate 5 的基础知识,还介绍了与之相关的前沿技术,如 NoSQL 和 Java 8。通过本书的学习,读者可以...
Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...
案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。
**Hibernate入门源代码详解** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个资源包包含了“chapter07”目录下的源代码,是学习Hibernate基础知识的理想起点。让...
15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...
- 双向一对一:双向关联意味着两个实体都能直接访问对方,除了`Person`表的外键,`IDCard`表也需要有一个字段指向`Person`,同样使用`<one-to-one>`标签。 3. 一对多(One-to-Many)关联映射: - 单向一对多:一...
《webwork+spring+hibernate入门实例》 在当今的Web开发领域,Spring、Hibernate和WebWork(现称为Struts 2)是三个极为重要的框架。本实例将引导初学者深入理解这三大框架的集成与应用,以及如何与MySQL数据库进行...
1. **一对一(OneToOne)**:一个实体对应另一个实体的唯一实例。 2. **一对多(OneToMany)**:一个实体可以有多个相关联的实体实例。 3. **多对一(ManyToOne)**:多个实体对应一个实体实例。 4. **多对多...
- 多种映射策略:支持一对一、一对多、多对多等多种关联关系。 - 对象的持久化管理:可以实现单个对象映射到多个表。 - 支持集合类型的映射。 - 多态关联:能够处理继承关系中的关联问题。 - SQL查询的自定义:允许...
MyEclipse作为一款强大的Java EE集成开发环境,内置了对Hibernate的支持,使得在项目中集成和使用Hibernate变得更加便捷。 本快速入门教程首先会介绍Hibernate的核心概念,如实体类(Entity)、持久化(Persistence...