【Hibernate 3】一对一映射配置
一、一对一映射简介
一对一关联映射有两种实现策略:
第一种:主键关联,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
第二种:唯一外键关联,外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系
其中一对一的关联映射,又分为单向一对一映射和双向一对一映射,这里主要介绍单向一对一映射。
二、实例介绍(主键关联)
2.1,建立两个实体对象类
IdCard类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate; public class IdCard { private int id;
private String cardNo; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getCardNo() {
return cardNo;
} public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}
</span>
映射文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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.angel.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo" />
</class>
</hibernate-mapping></span>
Person类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate; public class Person { private int id;
private String name; IdCard idCard; public IdCard getIdCard() {
return idCard;
} public void setIdCard(IdCard idCard) {
this.idCard = idCard;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
</span>
映射文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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.angel.hibernate.Person" table="t_person">
<id name="id">
<!--主键关联策略 -->
<generator class="foreign">
<!-- 标签中的值是指明标识来源于foreign方式,指定来源对象:Person类的属性idCard -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name" /> <!-- one-to-one指的是如何加载它的引用对象 外键约束要设为true -->
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
</hibernate-mapping></span>
2.2,生成数据库表单
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate; import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport; /**
* 将hbm生成ddl
* @author Administrator
*
*/
public class ExportDB { public static void main(String[] args) { //默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}</span>
2.3,Hibernate配置
<span style="font-family:KaiTi_GB2312;font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_one2one</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">登录密码</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property> <mapping resource="com/angel/hibernate/Person.hbm.xml"/>
<mapping resource="com/angel/hibernate/IdCard.hbm.xml"/>
</session-factory>
</hibernate-configuration></span>
2.4,测试类
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.angel.hibernate; import org.hibernate.Session; import junit.framework.TestCase; public class test_one2one extends TestCase { /**
* 测试保存
*/
public void testSave1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction(); IdCard idCard = new IdCard();
idCard.setCardNo("6688"); Person person = new Person();
person.setName("Angel");
person.setIdCard(idCard); // 先保存card,然后保存person,执行SQL语句为:
// Hibernate: insert into t_idcard (cardNo) values (?)
// Hibernate: insert into t_person (name, id) values (?, ?)
session.save(person); session.getTransaction().commit(); } catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback(); } finally {
HibernateUtils.closeSession(session);
}
} /**
* 测试加载
*/
public void testLoad() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction(); Person person = (Person) session.get(Person.class,Integer.valueOf("1")); System.out.println("person.getName()=" + person.getName());
System.out.println("person.getIdCard().getCardNo="+ person.getIdCard().getCardNo()); //执行的SQL语句
//Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from t_person person0_ where person0_.id=?
//Hibernate: select idcard0_.id as id1_0_, idcard0_.cardNo as cardNo1_0_ from t_idcard idcard0_ where idcard0_.id=?
//控制台结果:
//person.getName()=Angel
//person.getIdCard().getCardNo=6688
session.getTransaction().commit(); } catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
</span>
以上就是简单的单向一对一关联映射,关于双向关联映射和单向是类似的,在另一个实体映射关系中添加进去一对一的标签配置即可。
三、简单介绍外键关联
使用唯一外键关联,则需要在配置一对一关系时加上property—ref属性。如:我们在Person类中添加上IdCard的外键映射private IdCard idCard,那么在IdCard的配置文件中,则需要加上:
<one-to-one name="idCard" constrained="true" property-ref=“idCard”></one-to-one> 它表示本类(IdCard)的主键将会与关联类(Person)的此属性(idCard)相对应
四、总结
让我想一下,没有配置这种关联映射的时候,在加载数据的时候是怎么做的?
似乎我们一般是用连接查询,比如:where a.id=b.courseid等,或者是将外键的值查出来,然后拿着这个值去另一张表里查对应的数据。但是对于Hibernate来说,只是配置的问题,感觉上经过封装,简单了很多!接下来就是多对多、继承、集合映射的学习了。
【Hibernate 3】一对一映射配置的更多相关文章
- hibernate中一对一映射
一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...
- 9.hibernate的一对一映射
一.hibernate的一对一按照外键映射 1.创建如下sql脚本: --员工账号表 create table USERS1 ( USERID ) not null, USERNAME ), USER ...
- Hibernate的一对一映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- Hibernate框架 主配置文件 Hibernate.cfg.xml 映射配置 说明
1 主配置文件 Hibernate.cfg.xml 主配置文件中主要配置:数据库连接信息.其他参数.映射信息! 常用配置查看源码: hibernate-distribution-3.6.0.Final ...
- hibernate关于一对一注解配置
注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...
- mybatis一对一映射配置详解
听说mybatis一对一有三种写法,今天我试了一下. 数据库表准备 为了偷懒,我直接就拿用户权限菜单里的菜单表和菜单与权限的中间表做实现,他们原来是多对多的关系,这边我假设这两张表是一对一. 表 g ...
- Hibernate(七)一对一映射
一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...
- Hibernate表关系映射之一对一映射
一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...
- hibernate笔记--基于主键的单(双)向的一对一映射关系
上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...
随机推荐
- Hibernate4日志及配置文件
1. 确定要使用日志的实现log4j 2. Slf4japi.jar和log4j的jar包放入classpath,(slf4j-log4j.jar) 3. 编写log4j.properties 4. ...
- 一个原生的JavaScript拖动方法
代码: 1 function drag(t,p){ 2 3 var point = p || null, 4 target = t || null, 5 resultX = 0, 6 resultY ...
- PLSQL_基础系列11_递归和层次查询CONNECT BY(案例)
2015-05-31 Created By BaoXinjian
- c# 贪吃蛇源码
using UnityEngine; using System.Collections;using System.Diagnostics;using UnityEngine.SceneManageme ...
- minicom的安装及使用
1.下载 sudo apt-get install minicom 2.运行 sudo minicom -s 3.修改端口 首先查看端口:ls /dev/tty...
- Web性能压力测试工具之Apache AB 详解
下载安装地址: http://httpd.apache.org/download.cgi yum install httpd-tools http://www.apachelounge.com/dow ...
- 91、sendToTarget与sendMessage
Message msg = handler.obtainMessage(); msg.arg1 = i; msg.sendToTarget(); ...
- mysql 怎么登录
mysql -uroot -p回车后,输入密码,再回车即可.如果自己没有修改的话,默认密码为空.
- [SQL]SQL语言入门级教材_SQL语法参考手册(三)
SQL 语法参考手册 DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化.既易学又易懂的语法. 此语言几乎是每个资料库系统都必须提供 ...
- LeetCode 67. Add Binary
Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...