没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1 Hibernate 实体关联关系映射----总结
收集整理:Volunteer 2009 年 11 月 16 日 星期一
版权声明:原 创作 品 , 允 许 转 载 , 转 载 时 请 务 必 以 超 链 接 形 式 标 明 文章 原 始 出 处 、作 者 信
息 和 本 声 明 。 否 则 将 追 究 法 律 责 任 。 http://lavasoft.blog.51cto.com/62575/39398
1.1 引言
花了三天的业余时间,终于写完了 Hibernate 关联关系映射的所有实例,感觉还应该总结
一下。
Hibernate 映射关系错综复杂,在实际中真的都能用到吗?不用行吗?
在我看来,Hibernate 提供这些映射关系,常用就是一对一和多对一,并且在能不用连接表
的时候尽量不要用连接表。多对多会用到,如果用到了,应该首先考虑底层数据库设计是否合理。
在实际开发中,在 Hibernate 关联关系之外常常还有另外一种选择方案,表各自作为单表
映射,业务逻辑控制外键关系(有时候就是一个相关联的列,但不一定要加外键约束),这样更
加灵活,并且数据的完整性同样有保证。
当然,“单表映射,业务控制外键关系”并不是说 Hibernate 的实体关联功能是多余的,H
ibernate 的实体关联的优点很多,随便拿本书都是讲优点,用好了会让开发人员感觉更方便,
现在我也是两种方案结合使用。比如对于不很确定的两个实体,常常选用单表关联。
以前在初学 Hibernate 还没有完全搞清楚这些关联关系的时候,就是用单表映射,业务控
制外键关系做的,发现没有任何问题,程序同样运行得很好。
看了这些是不是后悔浪费时间学习映射关系了?呵呵,Hibernate 的 OR Mapping 是 Hibern
ate 的灵魂,我相信 Hibernate 的创始人比我们一般人的理解更深刻。只有学会了这些才能体会
Hibernate 设计者的思想。学一个东西,不光自己写代码,还应该能看懂别人的代码才行。因此
系统学习这些关联映射还是大有必要的。
以上都是我自己的观点。欢迎在此交流讨论。
Hibernate 在实际项目开发中,hbm.xml 包括数据库脚本都是通过 Xdoclet 生成的,在此不
采用 Xdoclet 的目的是为了便于理解这些映射模型。实体-数据表-映射文件 三者对比看,太直
观了。
瞌睡了,暂时先写到此,有新思路了再补上。。。。
2 Hibernate 关联关系映射实例速查
Hibernate 的映射关系很多,也比较复杂,也很容易忘记。这个基本上占据了 Hibernate
学习的七成时间。熟悉这些映射模型,需要大量的实践才能掌握。下面是我对 Hibernate 关联
关系映射的一个总结,放到 blog 上一是自己查看方便,二来也可以和更多 Hibernate 开发人员
交流分享。希望各位多多留言哦:)。
本文主要参考夏昕翻译的“Hibernate 参考文档 V3.12”,也在附件中给出了。
1. 本文的模块较多,映射关系部分分为一下模块:
Hibernate 关联关系映射目录
│
├─单向关联
│ ├─ 一对一外键单向关联
│ ├─ 一对一主键单向关联
│ ├─ 一对一连接表单向关联
│ ├─ 一对多外键单向关联
│ ├─ 一对多连接表单向关联
│ ├─ 多对一外键单向关联
│ ├─ 多对一连接表单向关联
│ └─ 多对多单向关联
└─双向关联
├─ 一对一外键双向关联
├─ 一对一主键双向关联
├─ 一对一连接表双向关联
├─ 一对多外键双向关联
├─ 一对多连接表双向关联
└─ 多对多双向关联
2. 本系列实例的开发环境:
Windows XP Professional 简体中文版
MySQL 5.0.45
Hibernate 3.12
Java SDK 1.5.06
IntelliJ IDEA 5.12
3. 系列实例中所用的 Hibernate 配置文件如下:
<?xml version='1.0' encoding='gb2312'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"[url]http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd[/url]">
<hibernate-configuration>
<session-factory>
<!--指定连接数据库驱动-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!--指定连接数据库的 url,hibernate 连接的数据库名-->
<property name="connection.url">jdbc:mysql://localhost:3306/hbstudy</propert
y>
<!--指定连接数据库的用户名-->
<property name="connection.username">root</property>
<!--指定连接数据库的用户密码-->
<property name="connection.password">leizhimin</property>
<!--指定连接池的大小-->
<property name="connection.pool_size">5</property>
<!--指定数据库的方言-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!--根据需要自动创建数据库,测试环境用-->
<property name="hbm2ddl.auto">create</property>
<!--在控制台显示执行的 SQL 语句-->
<property name="show_sql">true</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!--映射文件列表-->
<!--单向关联-->
<mapping resource="com/lavasoft/dx/_n_1_fk/Addressn1fk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_n_1_fk/Personn1fk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_n_1_tab/Addressn1tab.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_n_1_tab/Personn1tab.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_1_fk/Address11fk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_1_fk/Person11fk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_1_tab/Address11tab.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_1_tab/Person11tab.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_1_pk/Address11pk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_1_pk/Person11pk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_n_fk/Address1nfk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_n_fk/Person1nfk.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_n_tab/Address1ntab.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_1_n_tab/Person1ntab.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_n_n/Addressnn.hbm.xml"/>
<mapping resource="com/lavasoft/dx/_n_n/Personnn.hbm.xml"/>
<!--双向关联-->
<mapping resource="com/lavasoft/sx/_1_n_fk/Address1nfk_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_n_fk/Person1nfk_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_n_tab/Address1ntab_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_n_tab/Person1ntab_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_n_n/Addressnn_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_n_n/Personnn_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_1_fk/Address11fk_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_1_fk/Person11fk_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_1_pk/Address11pk_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_1_pk/Person11pk_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_1_tab/Address11tab_sx.hbm.xml"/>
<mapping resource="com/lavasoft/sx/_1_1_tab/Person11tab_sx.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4. 系列实例中所用到 Session 工厂是:
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("初始化 SessionFactory 失败!" + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session getCurrentSession() throws HibernateException {
Session s = (Session) session.get();
//当原 Session 为空或已关闭时,打开一个新的 Session
if (s == null || !s.isOpen()) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null) {
s.close();
}
}
}
2.1 单向关联
2.1.1 Hibernate 一对一外键单向关联(见_1_1_fk.zip)
事实上,单向 1-1 与 N-1 的实质是相同的,1-1 是 N-1 的特例,单向 1-1 与 N-1 的映射
配置也非常相似。只需要将原来的 many-to-one 元素增加 unique="true"属性,用于表示 N
的一端也必须是唯一的,在 N 的一端增加了唯一的约束,即成为单向 1-1。基于外键的单向 1-
1 的配置将与无连接表 N-1 关联的 many-to-one 增加 unique="true"属性即可。
一、模型介绍
一个人(Person)对应一个地址(Address)。
二、实体(省略 getter、setter 方法)
public class Person11fk {
private int personid;
private String name;
private int age;
private Address11fk address11fk;
public class Address11fk {
private int addressid;
private String addressdetail;
三、表模型
mysql> desc address_11fk;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| addressid | int(11) | NO | PRI | NULL | auto_increment |
| addressdetail | varchar(255) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
mysql> desc person_11fk;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| personid | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| addressId | int(11) | YES | UNI | NULL | |
+-----------+--------------+------+-----+---------+----------------+
四、生成的 SQL 脚本
CREATE TABLE `address_11fk` (
剩余52页未读,继续阅读
资源评论
- 天瞳月2015-06-18感觉逻辑很好,对初学者有用哟~~~
vincentqchow
- 粉丝: 0
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功