【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)当然也有组件类型

     

posted @ 2017-04-20 15:52  leader_Hoo  阅读(358)  评论(0编辑  收藏  举报