`

Hibernate点点

阅读更多

实体状态

        自由状态……实体对象在内存中自由存在,与数据库中的记录没有任何关联,处理自由状态的实例可以通过Session的save方法转换成持久状态。

        持久状态……实体对象处于由Hibernate框架所管理的状态,持久状态的对象其变更将由Hibernate固化到数据库中,持久对象对应数据库中的一条记录。

        游离状态……处于持久状态的实例,其关联的会话已经关闭,则此实例处于 游离状态。 游离状态的实例可以通过Session的 update方法再次和一个会话关联。

        游离状态和自由状态实例的区别是自由状态的实例与数据库缺乏对应关系,而游离状态的实例包含对应数据库记录的主键值。        

实体身份识别

        从数据库的角度,包括Hibernate本身对于拥有同样主键值的实体对象则认为他们是相同的。在持久层之外,对象是否等价在业务逻辑层可能有另外的含 义,往往有一些特定的数据实体判定规则,这可以通过重写equals和hashCode方法实现。

脏数据检查

        脏数据检查策略一般有两种方式:

        数据对象监控:可以借助动态代理或CGLIB拦截设值方法,一旦设值方法被调用,则将其标记为脏状态。

        数据版本比对:持久层框架维持数据对象的最新版本,当数据提交时将提交数据和此版本进行比对,如果发生变化则将其同步到数据库相应的库表。

        Hibernate采用数据版本比对方式,Hibernate会话保存所有与当前会话关联实体的当前实例和原始状态信息,可以参见SessionImpl 的内部类EntityEntry。

Load/Get

       这两个操作的功能都是从数据库中加载一个实例,两者的区别是前者如果没有找到匹配数据将抛出异常,后者将返回null。

List/Iterate

       这两个操作的功能都是从数据库中加载多个实例,两者的区别是Iterate方法会先从会话中或者二级缓存中获取,而list方法会直接查询数据库,如果需要的数据在缓存中存在,iterate可以提供更好的性能,相反的情况下iterate方法会更慢,它会首先执行查询仅从数据库中获取标识符,然后再分别查询初始化实例。

Update/Merge

       这两个操作都支持分离实例的重新关联。如果会话中已经包含同样标识符的实例,update方法会抛出异常,merge方法会合并更改再重新关联。

Flush

       Flush方法的主要功能是同步内存对象和数据库,flush操作缺省发生在一些查询操作之前,事务提交时或者调用flush方法时。
       显式调用flush方法并不能保证立即执行数据库同步,Hibernate保证Query.list方法不会返回过时或错误数据。
       可以通过Session.setFlushMode改变缺省行 为,不至于太频繁。FlushMode定义了三种不同的刷新方式:提交时刷新,自动刷新,不刷新(除非显式调用flush方法)。
       提交时刷新可能会导致查询操作获取过时数据。

级联

       Hibernate 会话的基本操作,包括persist,merge,saveOrUpdate等都有相应的级联样式设置,如果你希望关联集合针对某个操作进行级联设置,可 以在映射文件中设置

 

 

缺省的级联设置是none,表示任何操作都不支持级联。

 

       级联通常用在在一对一和一对多关系中。

继承映射

单表映射

      概述: 使用一张表映射整个继承树,需要一个类别字段区分一个数据行具体对应哪个类。 

      优点:有很好的查询性能,不需要进行表连接。

       缺点:有数据冗余。子类的字段无法建立非空约束。

类表映射

       概述:每个类对应一张表。子类表只包含扩展属性,子类表和父类表通过外键关联。

       优点:领域模型和数据库之间的关系非常明了。

       缺点: 查询时需要多表之间的内连接或左外连接操作。字段在层次中任何上下移动的重构都会导致数据库更改。

具体表映射(UNION)

       概述:每个具体类对应一张表,包含所有的字段。使用union-class进行定义。

       优点:与具体表映射(隐式多态)相比,支持多态查询。

       缺点:具体类不支持标识生成器,标识生成器在所有的具体类中共享。如果某个属性在超类中进行映射,则其列名在所有的子类表中必须相同。 

具体表映射(隐式多态)

        概述:每个具体类对应一张表,包含所有的字段。

       优点:查询子类时不需要关联。

        缺点:如果父类字段发生变动,所有的子类表必须同时进行修改。超类上的一次查找需要检查所有表,这会导致多次数据库访问或特殊连接操作。不支持多态外连接 抓取数据。不支持多态一对一和一对多关联。

集合映射    

       Hibernate要求实体的集合字段必须声明为接口类型,当持久化实体时,Hibernate会使用自己的集合实现。因此假定使用HashSet初始化 实体的集合字段,经过持久化后得到的集合字段并不是HashSet的实例,如果进行转型将发生错误。

有序/无序

       Hibernate支持Set,Bag,Map三种无序集合,List是有序集合,这里所谓的有序无序是指Hibernate持久化过程中,是否保持数据集合中的记录排列顺序。

可配置属性

       Lazy……缺省为true,表示不加载关联的集合。
       Cascade……缺省为none,表示不级联操作集合。
       Fetch……缺省为select,可以设置为join使用连接检索模式。
       optimistic-lock……缺省为true,表示集合状态的改变会导致拥有集合的实体的版本增加,如果是一对多关联,通常设置为false。

Inverse

       缺省为false,如果为true,表示关联由另一端管理。

Sort/Order-by

      Sort/Order-by属性用来设置集合排序,前者表示排序基于内存操作的,后者表示数据库检索时进行排序,通过指定SQL语句的order by部分来实现。

外键信息

      使用key元素进行定义。

元素类型

      使用element和composite-element定义值类型,使用one-to-many和many-to-many定义实体类型。

索引集合

      除SET和BAG外,其他集合都需要指定集合表中的索引列,LIST和ARRAY使用list-index元素定义,MAP集合使用map-key/composite-map-key或map-key-many-to-many定义。

List/Bag

      如果希望使用list声明集合字段,而表中又没有索引列,那么可以使用bag元素定义映射,bag元素不具备list的有序特性。

Bag/idBag

      Bag 类型是Hibernate自定义集合类型,实现一个允许包含重复元素的Set,因为Bag集合为无序集,且允许出现重复元素,这出现一个问题,当删除某个元素时如何定位待删除记录?目前的实现方式是先将表中原有的集合数据全部删除,再将现有数据逐条插入,显然这种方式的性能是极其低下的。
      idBag对此进行了扩展,提供一个collection-id元素用来配置id字段,根据此id,Hibernate可以准确定位库表记录,从而实现高效的数据操作。

事务/并发

      Hibernate直接使用JDBC和JTA资源的事务语义,没有添加额外的锁机制。SessionFactory是线程安全的,可以被所有的应用线程共享。Session是线程不安全的,通常用于单个请求,单个会话或单个工作单元。

      通常不管读写数据,数据库交互都应该发生在事务语义中。

      在多用户的C/S应用程序中,最通用的模式是基于请求的会话,使用单个的数据库事务服务整个客户请求,在WEB企业应用程序中,数据库事务跨越用户交互是无法接受的。

      会话会缓存每个处理持久状态的实例,这意味着如果保持会话打开一段比较长的时间,可能导致内存不足,也可能导致过时数据。一个解决方法是调用clear和evict方法管理会话,但是更应该考虑使用存储过程处理大数据量操作。

乐观并发访问

      支持高并发性和高扩展性的唯一方式是使用版本的乐观并发控制。版本检查使用版本号或时间戳来检查更新。Hibernate提供三种方式使用乐观并发控制。
      手动版本检查:每次数据库操作发生在一个新的会话中,开发者有责任在操作之前加载所有的持久化实例,手动执行版本检查。这种方式是最低效的,类似于实体EJB的方式。

      扩展会话方式的自动版本检查:Hibernate基于一次交互创建一个会话,在每次执行刷新时检查实例的版本,如果检测到并发更改将抛出异常,由开发人员负责捕获和处理异常。这种方式是最有效的,应用不必关心版本检查,不必重新关联分离状态的实例,也不必在每次数据库事务前重新加载所有的实例。

      分离状态实例的自动版本检查:应用可以操纵一个分离状态的实例的属性,这个实例是在另一个会话加载的,然后再和一个新的会话重新关联(通过调用update或saveOrUpdate方法),当新会话刷新时会自动执行版本检查。

      自定义版本检查:也可以通过设置属性或集合的optimistic-lock值为false禁止自动版本检测,也可以设置Class映射的 optimistic-lock属性为all,通过比较实例的所有字段进行版本检查,有时候并发更改只要没有发生叠加也是允许的,这可以通过设置 optimistic-lock属性为dirty实现。

悲观锁

      通常情况下用户不需要共太多时间关心锁策略,通过对JDBC连接指定隔离级别可以让数据库负责这些工作,然而高级用户可能需要获取排他锁或启动新事务时重新获取锁。
      Hibernate总是使用数据库的锁机制,LockMode类定义了Hibernate可以获得的锁级别,这可以通过Session的lock/load方法和Query的setLockMode方法进行操纵。

分享到:
评论

相关推荐

    hibernate 的点点滴滴

    hibernate hibernate hibernate hibernate hibernate

    Hibernate Many to Many 实现方式二

    Hibernate Many to Many 实现方式

    Hibernate Spring整合入门程序

    在IT行业中,Hibernate和Spring是两个非常重要的框架,它们分别专注于对象关系映射(ORM)和依赖注入(DI)。Hibernate使Java开发者能够更方便地处理数据库操作,而Spring框架则提供了一个全面的企业级应用开发解决...

    hibernate 3 6 10 1385635764976 rar

    《Hibernate 3.6.10:持久化框架深度解析》 Hibernate,作为一个开源的对象关系映射(ORM)框架,是Java开发中的重要工具,它极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据。这个压缩包...

    hibernate.org:hibernate.org网站的资源-html source website

    一点点的Git,一点点的Ruby,您就会得到本地的hibernate.org服务。 目录 获取来源 > git clone git@github.com:hibernate/hibernate.org.git > cd hibernate.org 设置构建环境-简单的方法 设置构建环境的最简单...

    hibernate-orm-5.6.3.rar

    Hibernate数据持久层框架是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate...

    spring4+springmvc4+hibernate4 整合DEMO

    在IT行业中,Spring、SpringMVC和Hibernate是Java企业级应用开发中不可或缺的三大框架。它们各自负责不同的职责,Spring作为整体的IoC(Inversion of Control)/DI(Dependency Injection)容器,SpringMVC是Spring...

    Hibernate Many to Many 实现方式一

    Hibernate Many to Many 实现方式一

    Hibernate学习

    Hibernate双向关联配置用set与bag的总结

    (2.0版本)自己写的struts2+hibernate+spring实例

    可以直接导入. <br>查看说明: 当前只是自己看struts2的一点点资料随便写的一个简单的增删改查程序.全当给所有打算使用struts2却没有接触过的人一个入门而已.我也是初看.才2天而已.所以各位高手就不要笑话了.愿...

    自己写的struts2+hibernate+spring实例

    可以直接导入. <br>查看说明: 当前只是自己看struts2的一点点资料随便写的一个简单的增删改查程序.全当给所有打算使用struts2却没有接触过的人一个入门而已.我也是初看.才2天而已.所以各位高手就不要笑话了.愿...

    jpa-workshop:在我的 JPAHibernate 研讨会中使用的一系列示例

    我用来运行 JPA/Hibernate 研讨会的点点滴滴。 代码使用 maven 和 Spring 来运行示例映射 锡罐中包含什么? 没什么太狂野的 一对一 一对多/多对一 多对多 嵌入式 辅助表 遗产 懒惰抓取 查询 JPQL 命名查询 Spring...

    JSF的入门是点点滴滴

    在深入学习JSF的过程中,开发者还会遇到更复杂的话题,如组件库(如PrimeFaces)、Ajax支持、异步请求处理以及与Spring、Hibernate等框架的集成。JSF作为一个成熟的框架,为Web应用开发提供了丰富的功能和便利性,是...

    Java JDBC由浅入深

    当今orm等全自动针对对象持久化的框架越来越多并且也越来越成熟(ibatis,hibernate,ejb的jpa),但是无奈新东家需要使用jdbc(原始手工作坊)的模式和数据库打交道,用了几年的ibatis,再次使用jdbc发现有些细节和...

    Java JDBC由浅入深.pdf

    hibernate,ejb 的 jpa),但是无奈新东家需要使用 jdbc(原始手工作坊)的模式和数据 库打交道,用了几年的 ibatis,再次使用 jdbc 发现有些细节和底层的东西自己并不是十 分清楚,所以就啰理啰嗦的整理出一份学习...

    ssh 配置

    网上有很多关于SSH架构的实例...就是完成一个人员的CRUD操作,麻雀虽小,五脏俱全,希望能对从来没有接触过三者结合开发的朋友带来一点点帮助,这个例子,也算是我的入门实例,从此,开始Struts+Spring+Hibernate之旅

    in.relation.to:in.relation.to网站的来源

    如何在in.relation.to上构建和博客一点点的Git,一点点的Ruby,您将获得本地in.relation.re服务。 目录提示与技巧Rake构建文件中还存在其他哪些任务? 如果您的更改不可见... 尝试直接执行awestruct时出现错误Fedora...

    ssh2框架工具包

    javassist-3.12.0.GA.jar(hibernate同样需要) spring: spring.jar commons-logging-1.1.1.jar common-annotations.jar aspectjrt.jar aspectjweaver.jar cglib-nodep-2.1_3.jar (如果用BasicDataSource...

    grails-4.0.3.rar

    给下载不方便的朋友提供一点点便利,最新版本。 Grails 4 ships with the following dependency upgrades: Groovy 2.5.6 GORM 7 and Hibernate 5.4 (now the default version of Hibernate for new applications) ...

    SSH框架搭建

    SSH框架搭建,struts2,hibernate4,spring3框架的搭建,包含了所有的包,由于现在的项目比较老,所以抽空学习了稍微高版本的框架或许对初学者有帮助。希望大家能学到一点点东西。QQ727030664,欢迎交流

Global site tag (gtag.js) - Google Analytics