【hibernate 初探】之 关系映射,ORM
从整理上讲,一个ORM框架(以hibernate为例)所涉及内容无非就是,如何映射,如何检索,还有事务处理。所以从这三方面入手,基本上可以保证将hibernate可以用到自己的项目之中。所以我先说一下我对orm的映射,欢迎吐槽,互相交流,共同进步。
1:ORM中设计对象模型
一个Java对象,域模型,保存在内存中。一个是数据库关系对象,保存在表中。
2:不考虑hibernate,JDBC持久化实体域
就是采用原生jdbc语句,加载驱动,建立连接,(事务开启),创建句柄,执行查询(或者增删改),手动解析结果集初始化实体域,(关闭事务)
开发中一定不会用,了解一下就好
3:涉及ORM的分层
说一下,在这里我开始的时候,直接用baseDao(抽象得dao层公共方法),然后在业务逻辑层写sql(被骂的狗血临头),实际上这是非常挫的设计。应该在持久层写sql代码。
4:orm映射
原生jdbc去映射,一定不会有人用。一般都是采用orm中间件,比如hibernate,
常见的orm中间件hibernate mybatis topllink, (java EE 中也有ORM框架,以JPA(java持久化接口)作为ORM框架的标准API)
5: hibernate中 ORM映射的
5.1对象关系映射基础
javaBean风格(提供get set)
当session.save()时,调用getXXX(),拿到值保存到表
当session.load(),调用setXXX()将值塞到实体域对象
实体域中的 private 只是影响 实体对象,与hibernate无关。
第二点:hibernate是通过反射获取的属性(如果不写get,set,只能是声明属性assess设置为field来反射得到)
第三点:getXXX() setXXX()也可以带一些逻辑(一般不推荐,比如需要计算,可以写在get set方法。但是实际上应该写到业务逻辑层)
5.2 映射对象标识符
ORM框架中区分业务主键与代理主键(一般都是用代理主键)在java对象中根据内存地址区分对象
5.3映射对象
精粒度对象模型,粗粒度对象模型。映射组成关系
建表的原则是:尽量减少过多的外键关系(影响效率)
建对象模型的原则是:精粒度的对象,利于复用
区分值类型与实体类型,具有组成关系的持久化类
5.4映射实体关联关系(我会单独博文说明)
一对一,一对多,多对多。
注意即使是一对一,从性能上讲也不要配置一对一,要配置一对多。
多对多一般通过配置中间表。
多对多的情况下 cascade 可以配置 save-update。但是不允许配置成all。因为级联删除的时候,多对多会有问题
一对多的配置:
一的一端采用Set来保存,多的一端保存一的对象。 级联更新让一的一端维护,提高效率。 一的一端比如Set a = new HashSet()最好初始化。
在数据库中,多的一端保存外键ID,在关系型数据库中,实际上只支持多对一和一对一
5.5 hibernate类型映射
基本属性映射,
Date时间类型映射(标准sql中只有DATE,TIME,TIMESTAMP)
大字段类型映射(BLOB和CLOB)
hibernate也可以自定义映射类型
5.6映射继承关系
实体类中也存在继承关系,数据库表中不存在继承关系
需要自己考虑是映射父类,还是映射每一个子类
5.7映射值的类型(比如Set List Map)当然也有组件类型
作者:leader_Hoo
出处:http://www.cnblogs.com/ldh-better/
本文版权归作者和博客园共有,欢迎转载,唯一要求的就是请注明转载,此外,如果博客有帮助,希望可以帮忙点击推荐和分享,谢谢