一对一主键关联映射是hibernate关联映射中比较重要的一种,使用于两个关系比较紧密的对象之间的关联,一对一不说,一般还要共存亡。hibernate的做法是让两个实体对象的id保持相同。
人和身份证是典型的一对一关联映射的例子。
1.实体模型:
此处单向是由person加载idcard,所以Person中要保存IdCard的对象。
2.关系模型:
表person 表idCard
----------------------- --------------------------
| id | name | | id | cardNo |
------------------------ --------------------------
3.实体类:
IdCard.java
public class IdCard {
private Integer id;
private String cardNo;
//一系列的setter.getter方法
}
private Integer id;
private String cardNo;
//一系列的setter.getter方法
}
Person.java
public class Person {
private Integer id;
private String name;
private IdCard idCard;
//一系列的setter.getter方法
}
private Integer id;
private String name;
private IdCard idCard;
//一系列的setter.getter方法
}
4.映射文件:
IdCard.hbm.xml
<class name="com.sxt.hibernate.one2one.entity.IdCard" table="sxt_hibernate_idCard">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="cardNo" length="10"></property>
</class>
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="cardNo" length="10"></property>
</class>
Person.hbm.xml
<class name="com.sxt.hibernate.one2one.entity.Person" table="sxt_hibernate_person">
<id name="id" length="4">
<!-- person的主键来源于idCard,也就是共享idCard的主键 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name" length="10"></property>
<!--one-to-one标签的含义,指示Hibernate如何加载它的关联对象,默认根据主键加载。
constrained="true"的含义,表明当前主键上存在一个约束,person的主键作为外键参照了idCard,
这里在进行person对象操作时,要求idCard不 能为null
-->
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
<id name="id" length="4">
<!-- person的主键来源于idCard,也就是共享idCard的主键 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name" length="10"></property>
<!--one-to-one标签的含义,指示Hibernate如何加载它的关联对象,默认根据主键加载。
constrained="true"的含义,表明当前主键上存在一个约束,person的主键作为外键参照了idCard,
这里在进行person对象操作时,要求idCard不 能为null
-->
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
5.hibernate配置文件:
hibernate.cfg.xml
<session-factory>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:ORCL10</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">yf123</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/sxt/hibernate/one2one/entity/IdCard.hbm.xml"/>
<mapping resource="com/sxt/hibernate/one2one/entity/Person.hbm.xml"/>
</session-factory>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:ORCL10</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">yf123</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/sxt/hibernate/one2one/entity/IdCard.hbm.xml"/>
<mapping resource="com/sxt/hibernate/one2one/entity/Person.hbm.xml"/>
</session-factory>
6.测试方法:
test.java
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入操作
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
person.setIdCard(idCard);
//不会出现TransientObjectException异常,因为一对一主键关联映射中默认了cascad属性
session.save(person);*/
/**
* 测试加载操作
*/
Person p=(Person)session.load(Person.class, 1);
System.out.println(p);
System.out.println(p.getIdCard());
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入操作
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
person.setIdCard(idCard);
//不会出现TransientObjectException异常,因为一对一主键关联映射中默认了cascad属性
session.save(person);*/
/**
* 测试加载操作
*/
Person p=(Person)session.load(Person.class, 1);
System.out.println(p);
System.out.println(p.getIdCard());
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
7.测试结果:(打印对象时,我覆盖了Person和IdCard类的toString()方法)
Hibernate: select hibernate_sequence.nextval from dual
Person:张三
Idcard:1234567890
Hibernate: insert into sxt_hibernate_idCard (cardNo, id) values (?, ?)
Hibernate: insert into sxt_hibernate_person (name, id) values (?, ?)
Person:张三
Idcard:1234567890
Hibernate: insert into sxt_hibernate_idCard (cardNo, id) values (?, ?)
Hibernate: insert into sxt_hibernate_person (name, id) values (?, ?)
相关推荐
本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个实际的例子来帮助理解。 在一对一主键关联映射中,两个实体共享同一个主键,这意味着它们在数据库中的记录具有相同的标识符。这种映射关系通常用于...
在Java的持久化框架...总结来说,Hibernate的一对一主键关联映射,尤其是双向关联,能有效地简化对象关系的映射,提高代码的可读性和维护性。然而,需要根据实际情况权衡其带来的性能影响,确保系统设计的高效性。
**标题详解:** "Hibernate教程06_关系映射之一对一单向主键关联" 在Hibernate框架中,关系映射是将数据库中的表关系映射到对象模型上的过程。本教程聚焦于一对一(One-to-One)单向主键关联,这是一种特定类型的...
本文将详细解析如何实现一对一唯一外键(Uniquely Foreign Key,UFK)关联映射,特别是在单向关联的情况下的具体操作。 在一对一的关联中,两个实体类之间存在一对一的关系,比如一个用户只有一个身份证,或者一辆...
本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...
在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有另一个实体的引用,而双向一对一映射则意味着两个实体都可以互相引用。这种关联关系在数据库层面通常通过主键外键约束来实现,但...
通过以上步骤,我们就可以在Hibernate中实现单向一对一主键映射。这个实例中的`hibernate_fifth_one2one_pk_1`文件可能包含了相关的代码示例或测试用例,供你参考和学习。理解并掌握一对一映射是提高Hibernate使用...
本知识点主要讲解的是使用Hibernate实现一对一主键关联(Primary Key Join)的方式,通过注解进行配置。 一对一的关联在数据库设计中并不常见,但当两个实体之间确实存在一对一的关系时,如用户和其个人资料,这种...
本教程将详细解释如何通过代码实现Hibernate的一对一主键关联。 首先,我们需要理解一对一关联的含义:在数据库中,如果一个表的记录只能与另一个表的唯一一条记录对应,这就构成了主键关联的一对一关系。例如,一...
在数据库设计中,一对一主键关联是一种常见的关系模型,它用于表示两个表之间存在一对一的映射关系。这种关系意味着每个表中的记录都只能与另一个表中的唯一一条记录相关联。在本视频教程中,我们将深入探讨一对一...
**标题:“Hibernate一对多单向关联映射”** 在Java持久化框架Hibernate中,一对多关系是常见的数据关联模式,它表示一个实体可以与多个其他实体相关联。在这个主题中,我们将深入探讨如何在Hibernate中实现一对多...
这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...
本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...
一对一主键关联是通过共享主键实现的,这意味着两个实体类共用同一个主键。在这种情况下,被引用的实体类(如 Address)不再有自己的独立主键生成策略,而是依赖于引用它的实体类(如 Person)生成主键。在 ...
在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...
**标题:** Hibernate一对一关联映射 **描述:** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。一对一(OneToOne)关联映射是Hibernate提供的一种对象关系映射策略,它...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理数据库中的唯一外键关联时。这种映射方式允许在一个实体类中引用另一个实体类的唯一实例,形成一对一的关系。在...