一个人只能有一个身份证号码。
1对1单向关联,即单向引用,例如:person持有cardid的引用。
1对1双向关联,即双向引用,互相持有对对方的引用。
1对1主键关联,主键关联主键,也就是说有一方主键不需要自己建立,而是引用了另一方的主键。
1对1外键关联。
一、单向一对一主键关联映射:
通常使用一个特定的id生成器:
<?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.wyx.hibernate.IdCard">
<id name="id">
<generator class="native"/>
</id>
</class>
</hibernate-mapping>
<?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.wyx.hibernate.Person">
<id name="id">
<generator class="foreign">
<param name="property">idcCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idcCard" constrained="true"/>
</class>
</hibernate-mapping>
这里的主键生成策略:
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
foreien表示person的主键来源于关联对象的标识,<param name="property">idCard</param>是固定写法,
表示该主键受约束,约束方来自<param name="property">指定的值,这里的值是person的关系字段(关联对象),体现在实体类或者实体类的映射关系上也就是表明该主键受的约束是来自其他表。这样配置后,person就能拿到idCard的主键作为自己的主键了。
关系型数据库两张表如果存在关联,必须存通过外键表达。体现在对应的实体类中就是通过关系字段。体现在实体类的映射文件上就是只要存在外键关系,就必须存在<many-to-one><one-to-one>等的标签映射这种外键关系。
这里的一对一主键关联比较特殊,在关系型数据库两张表中看不出有外键关联,person的主键既是主键又充当了外键,因为该主键参考了idCard的主键。
那么我们加载person的时候,根据one-to-one标签,这个标签标示怎么加载这个引用对象,过程是把person中的主键譬如1拿出来,到idCard的id中去比对,找到引用对象。最后我们别忘了把外键约束constrained="true加上,表示person的主键上存在一个约束,person的主键作为外键参照了idCard。
最后,写一个测试类:
public void one2oneSaveTest(){
Session session = HibernateUtils.getSession();
try {
session.beginTransaction();
IdCard idcCard = new IdCard();
//idcCard.setId(12345678);
Person person = new Person();
person.setIdcCard(idcCard);
person.setName("小明");
session.save(person);
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
打印:
Hibernate: insert into IdCard values ( )
Hibernate: insert into Person (name, id) values (?, ?)
为什么idcCard 没有save,也没有设置casecade属性,就能级联添加了呢?
因为一对一主键关联映射比较特殊,内置默认了casecade属性,系统会自动先把idCard保存。
一对一主键关联映射,体现在数据库上时没有多余的字段去维护关联关系,仅仅通过主键去互相关联,
二、单向一对一唯一外键关联映射
一对一外键关联会生成一个字段维护外键关系,是多对一外键关联映的一种特例,与多对一不同的只是不允许多个person指向一个card,即不允许card属性出现重复值,通过限定多的一方的unique = true,这样就限制了多的一方对象关联唯一。
<many-to-one name=""idCard"" unique="true"/>
与多对一需要注意的问题一样,在save person对象之前,必须先save idCard对象,或者设置casecade = true。
<?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.wyx.hibernate.Person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true" cascade="all"/>
</class>
</hibernate-mapping>
public void testone2one_Save(){
Session session = HibernateUtils.getSession();
try {
session.beginTransaction();
IdCard idcCard = new IdCard();
idcCard.setCardid("370211198606150012");
Person person = new Person();
person.setIdcCard(idcCard);
person.setName("小明");
session.save(person);
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
打印输出:
Hibernate: insert into IdCard (cardid) values (?)
Hibernate: insert into Person (name, idCard) values (?, ?)
双向一对一唯一外键关联映射、双向一对一主键关联映射用的不是很多,以后遇到再加以说明。
分享到:
相关推荐
在本篇关于“Hibernate3.2(六)多对一关联映射”的主题中,我们将深入探讨在Java Persistence API(JPA)框架下,如何利用Hibernate实现多对一的关联映射。Hibernate作为JPA的一个实现,是Java开发中常用的ORM...
Hibernate 3.2 是一个非常重要的Java持久化框架版本,它极大地简化了数据库与Java对象之间的交互,使得开发者能够更加专注于业务逻辑而不是繁琐的数据访问层实现。本篇将深入探讨Hibernate 3.2的主要特性、核心概念...
6. **一对多、多对一、一对一关联映射** - 通过@ManyToOne、@OneToMany、@OneToOne注解定义不同类型的关联关系,简化了数据间的关联操作。 7. **延迟加载(Lazy Loading)** - Hibernate支持属性和关联的懒加载,...
6. **关联映射**:支持一对一、一对多、多对一、多对多等多种关联关系的映射。 在使用这两个JAR文件时,开发者需要确保有相应的JDBC驱动以连接数据库,并配置Hibernate的配置文件(如hibernate.cfg.xml),定义...
通过对Hibernate 3.2源码的阅读和分析,开发者可以深入理解其内部机制,学习如何优化数据访问,如何处理复杂的关联关系,以及如何实现更高效的缓存策略。这对于提升Java企业级应用的开发能力具有极大的价值。
- **一对一映射**:处理两个实体之间的一对一关联关系。 - **一对多映射**:处理实体间的多对一或多对多关系。 - **继承映射**:支持不同类型的继承关系映射到数据库。 #### 六、查询语言 - **HQL (Hibernate ...
11. **Association Mapping关联映射**:Hibernate支持一对一、一对多、多对一、多对多等各种关联映射,方便地处理复杂的对象关系。 12. **延迟加载Lazy Loading**:Hibernate的懒加载机制可以推迟到真正需要时才...
5. **关系映射(Relationship Mapping)**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)关系。理解这些关系的配置和使用是掌握Hibernate的关键。 6. **会话(Session...
9. **集合映射**:在实体类中,可以定义一对多、一对一、多对一、多对多的关系。Hibernate提供了丰富的集合类型(如List、Set、Map等)来映射这些关系。 10. **延迟加载(Lazy Loading)**:为了提高性能,...
11. **关联映射**:Hibernate 支持一对一、一对多、多对一和多对多的关系映射,通过注解或XML配置来定义实体之间的关联。 12. **延迟加载(Lazy Loading)**:为了优化性能,Hibernate 实现了延迟加载机制。默认...
Hibernate3.2_API 是一套针对该版本的API文档和指南,对理解并使用Hibernate 3.2提供了详细指导。 1. **对象关系映射(ORM)**:ORM是一种编程技术,它通过在对象和关系数据库之间创建映射,简化了数据访问。...
Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。在Hibernate 3.2版本中,开发者们能够更深入地理解其内部机制,从而提高开发效率和应用性能。本篇文章将详细解析...
3. **实体映射**:讲解如何使用Hibernate的XML映射文件(.hbm.xml)或注解来定义Java类与数据库表之间的映射关系,包括字段映射、主键生成策略、关联映射(一对一、一对多、多对一、多对多)等。 4. **Session接口*...
9. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)等关系映射,以及懒加载和立即加载策略。 10. **类型系统和用户类型**:Hibernate支持多种内置类型...
Hibernate3.2是其一个重要版本,它带来了许多改进和新特性,包括性能优化、对JPA的支持以及更多的查询选项。 ### Hibernate3.2 API `hibernate3.2API`是指Hibernate 3.2版本的官方API文档。这个文档详细介绍了各种...
3. 集合映射:一对多、多对多关系的映射,如Set、List、Map等集合类型的处理。 4. 异步查询:通过Hibernate的FutureResult和Query.listAsync()实现异步数据检索。 5. 动态模型:无需预先定义实体类,可以动态构建...
5. **关联映射**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等关系的映射,通过`@OneToOne`、`@OneToMany`等注解实现。 6. **事件监听**:Hibernate允许注册监听器...
5. **Association Mapping**:Hibernate 支持多种关联映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)。这些映射方式允许对象之间的复杂关系在数据库中得以体现。 6....
Hibernate 是一个开放源代码的对象关系映射(ORM)框架,它为Java开发者提供了对关系数据库的强大而灵活的处理方式。Hibernate 3.2是该框架的一个重要版本,它在前一版本的基础上进行了一系列的改进和优化,提升了...