
深入浅出Hibernate
文章平均质量分 74
目前我正在系统的学习Hibernate,我特意在这里整理一个专栏,我们可以一起系统的学习Hibernate,共同进步。
孙悟空2015
追根溯底,回归本质,挖掘兴趣,激发思考。
展开
-
精通Hibernate——Hibernate内置标识符详解
1、increment标识符生成器 由Hibernate以递增的方式为代理主键,例如:<hibernate-mapping> <class name="mypack.IncrementTester" table="INCREMENT_TESTER" > <id name="id" type="long" column="ID" > <meta att原创 2015-07-27 22:00:24 · 1419 阅读 · 0 评论 -
精通Hibernate——建立单向多对一关联
在类与类之间各种各样的关系中,要算多对一的单向关联关系和关系数据库中的外键参照关系最匹配了。因此,通常选择从Order到Customer的多对一单向关联。简要代码如下:public class Customer implements Serializable{ private Long id; private String name; ....}public class原创 2015-07-28 21:53:13 · 898 阅读 · 0 评论 -
精通Hibernate——建立双向一对多关联
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象或者一组与他关联的对象。 对象位于内存中,在内存中从一个对象导航到另一个对象显然比到数据库中查询数据速度快多了。类与类之间到底建立双向还是单向都是由业务决定。以Customer和Order为例,如果软件应用有大量这样的需求: 根据客户可以查询该客户所有的订单 根据给定的订单可以查询发出订单的客户 以上需求就需要我们为Custome原创 2015-08-04 19:43:09 · 722 阅读 · 0 评论 -
精通Hibernate——Java对象在JVM中的生命周期
当应用程序通过new语句创建一个对象时,JVM会为这个对象分配一块内存空间,只要这个对象被引用变量引用,他就一直存在在内存当中。当这个对象不被任何对象引用的时候,他的生命周期就意味着结束,JVM会在适当的时候回收这个对象。下面通过代码来演示下生命周期:Customer c = new Customer("Tom",new HashSet());Order o1 = new Order("Tom_o原创 2015-08-05 19:27:13 · 943 阅读 · 0 评论 -
精通Hibernate——映射一对多双向自身关联关系
首先我们来看下图: 每种商品类别代表一个Category对象,每一个Category可以和父列表关联,同时也可以和子类别关联,为了表达这种一对多的双向自身关联关系可以在Category类中定义两个属性: parentCategory:引用父类别对象 childCategories:引用一组子类别对象 下面看看Category的源代码:public class Category imp原创 2015-08-05 19:24:48 · 1312 阅读 · 0 评论 -
精通Hibernate——理解HibernateSession缓存
如何希望一个Java对象一直处于生命周期中,就必须保证至少有一个变量引用他,或者在一个Java集合中存放了这个对象的引用。在session接口的实现类SessionImpl中定义了一系列的Java集合,这些Java集合构成了session的缓存。例如:private final Map entitiesByKey;//....entitiesByKey.put(key,Object);// 向s原创 2015-08-12 19:38:53 · 893 阅读 · 0 评论 -
精通Hibernate——Hibernate中Java对象的状态详解
Hibernate中对于要持久化的Java对象在他的生命周期中需要经历以下几种状态: 1、临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于session的缓存中。处于临时状态的Java对象被称为临时对象。 2、持久化状态(persistent):已经被持久化,加入到session中,处于持久化的状态Java对象被称为持久化对象。 3、游离状态(detached):已原创 2015-08-13 19:15:55 · 1510 阅读 · 0 评论 -
精通Hibernate——Session的保存、更新、删除和查询
session的save方法 使一个临时对象变为持久化对象。 session的save方法完成以下操作: 1、把customer对象加入到缓存中,使他变为持久化对象 2、选用映射文件指定的标识符生成器为持久化对象分配唯一的OID。Customer.hbm.xml文件中id元素的 子元素指定标识符生成器:<generator><id name="id" column="ID" >原创 2015-08-20 19:18:01 · 2047 阅读 · 0 评论 -
精通Hibernate——级联操纵对象
当我们加载一个类时session会加载所有和该类直接关联或者间接关联的对象。 在对象关系映射文件中,用于映射持久化类之间关联关系的元素,如、和元素,都有一个cascade属性,他用于指定如何操纵与当前关联的对象,他的可选属性如下: none:在保存、更新或删除对象时,忽略其他关联的对象,他是cascade默认属性 save-update:当通过session的save、update以及save原创 2015-08-29 17:23:33 · 961 阅读 · 0 评论 -
精通Hibernate——Hibernate使用触发器需要注意的两点
数据库系统有时会利用触发器来完成某些业务规则。触发器在接收到特定的事件时被激发,执行事先定义好的一组数据库操作。能激发触发器运行的时间可以分为以下几种: 1.插入事件,insert 2.更新记录事件,update 3.删除记录事件,delete Hibernate与数据库中的触发器协同工作时会造成两类问题: 1.触发器使Session的缓存中的数据与数据库不一致 在激发执行触发器之后在执原创 2015-08-29 19:34:36 · 4158 阅读 · 0 评论 -
精通Hibernate——映射组成关系
建立域模型与关系型数据模型有着不同的出发点。域模型是由程序代码组成,通过细化持久化类的粒度提供代码可重用度,简化编程。关系数据模型由关系数据组成。存在数据冗余的情况下,需要把粗粒度的表拆分为具有外键参照关系的几个细粒度表,从而节省表的存储空间;另一方面在没有数据冗余的前提下,应尽可能减少表的数量,简化表之间的参照关系,以便提高数据库的访问速度。 由于建立域模型和关系型数据的原则不一样,使得持久化类原创 2015-08-31 16:53:05 · 992 阅读 · 0 评论 -
精通Hibernate——Hibernate的两种映射类型说明
Hibernate的映射类型分为两种,内置映射类型和客户化映射类型。 内置映射类型:负责把一些常见的java类型映射到相应的SQL类型 客户化映射类型:Hibernate允许用户实现UserType或CompositeUserType接口,来灵活定制客户化映射类型。客户化映射类型能够把用户定义的Java类型映射到数据库表的相应字段。 1、Hibernate内置的映射类型 1.1 Ja原创 2015-09-01 19:28:57 · 1142 阅读 · 0 评论 -
精通Hibernate——Hibernate的检索策略
在Session的缓存中存放的是互相关联的对象图。在默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象,下面我们以Order和Customer为例介绍如何配置Hibernate的检索策略,以优化检索性能。 Session有三种检索方法:load,get和find,他们都用来从数据中检索对象。load和get按照参数指定的OID加载一个持久化对象原创 2015-09-02 09:43:56 · 758 阅读 · 0 评论 -
精通Hibernate——HQL查询详解
十三四原创 2015-09-02 15:50:50 · 908 阅读 · 0 评论 -
精通Hibernate——报表查询、技巧以及优化
投影查询 是指查询结果仅包含部分实体或实体的部分属性。投影是通过select关键字来实现的。以下Hql会检索出Customer及关联的Order对象from Customer c join c.orders o where o.orderName like 'T%';如果希望查询结果中只包含Customer对象select c from Customer c join c.orders o whe原创 2015-09-06 14:36:34 · 1544 阅读 · 0 评论 -
精通Hibernate——数据库的事务与声明事务边界
数据库事务必须具备ACID特征,分别是原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability) 声明事务包含以下内容: 1、事务的开始边界 2、事务的正常结束边界(commit):提交事务 3、事务的异常结束边界(rollback):撤销事务,使数据回到事务前的状态 数据库系统支持以下两种事务 1、自动提交模式:每个sql语句原创 2015-09-06 17:46:46 · 1736 阅读 · 0 评论 -
精通Hibernate——多事务并发运行的并发问题
对于同时运行的多个事务,当这些 访问数据库中相同的数据时,如果没有必要的隔离机制,就会导致各种并发问题,这些问题可以归纳为以下几类: 1、第一类丢失更新:撤销一个事务时,把其他事务已提交更新的数据覆盖。 2、脏读:一个事务读到另一个事务未提交的事务 3、虚读:一个事务读到另一个事务已提交的新插入的数据 4、不可重复读:一个事务读到另一个事务已提交的更新数据 5、第二类丢失更新:一个事务覆盖原创 2015-09-07 10:42:37 · 3252 阅读 · 1 评论 -
精通Hibernate——数据库系统锁的基本原理
锁的基本原理如下: 1、当一个事务访问某种数据库资源时,如果执行select语句,必须先获得共享锁,如果执行insert、update或delete语句,必须先获得独占锁,这些锁用于锁定被操纵的资源 2、当第二个事务也访问相同的资源时,如果执行select语句,也必须先获得共享锁,如果执行insert、update或delete语句,也必须先获得独占锁。此时根据已经放置在资源上锁的类型,来决定第原创 2015-09-09 15:26:56 · 1045 阅读 · 0 评论 -
精通Hibernate——应用程序中的悲观锁和乐观锁
当数据库采用read commited隔离级别时,会导致不可重复读和第二类丢失更新的并发问题。可以使用悲观锁或者乐观锁来避免这类问题 悲观锁:在应用程序中显式的为数据资源加锁,悲观锁假定当前事务操纵数据资源时,肯定还会有其他事务同时访问该数据,为了避免当前事务操作收到干扰,先锁定资源,但是他会影响性能。 乐观锁:假定当前操纵数据资源时,不会有其他事务同时访问该数据资源,此时,完全依赖数据库的隔离原创 2015-09-09 17:27:38 · 1003 阅读 · 0 评论 -
精通Hibernate——Hibernate缓存详解
Session的缓存时内置的,不能被卸载,称为Hibernate的一级缓存,SessionFactory有一个内置缓存和一个外置缓存,其中外置缓存时可插拔的缓存插件,级为Hibernate二级缓存。第二级缓存本身实现很复杂,必须实现并发访问策略以及数据过期策略。 持久化层缓存的范围 持久化层的缓存范围决定了缓存的生命周期以及可以被谁访问。缓存的范围可以被分为三类 1、事务范围 缓存只被当前事原创 2015-09-14 14:46:59 · 764 阅读 · 0 评论 -
精通Hibernate——Java的内存地址与Hibernate的内置对象标识符
在Java语言中,判断两个对象引用变量是否相等,有以下两种比较方式: (1)比较两个变量所引用对象的内存地址是否相同,“==”就是比较的内存地址。此外,在Object类中定义的equals(Object o)也是按内存地址来比较的。如果用户自定义的类没有覆盖equals(Object o)方法,也是按照内存地址来比较的。例如,以下代码用new语句共创建了两个Customer对象,,并定义了三个Cu原创 2015-07-25 20:27:21 · 1595 阅读 · 0 评论 -
精通Hibernate——Hibernate核心接口
应用程序可以通过Hibernate的API访问数据库,Hibernate API中的接口可分为以下几类: 提供访问数据库的操作(保存、更新、删除、查询)接口,这些接口包括Session、Transaction、Query接口 用于配置Hibernate的接口:Configuration 回调接口,使应用程序接受Hibernate内部发生的事件,并做出相关回应,这些接口包括:Intercepto原创 2015-07-23 22:55:05 · 1061 阅读 · 0 评论 -
精通Hibernate——域对象之间的关系
在域模型中,类之间存在四种关系 1、关联(Association) 类之间的引用关系,可以有一对一、一对多和多对多,例如customer与order之间就是一对多public class Order{ // 与order对象关联的Customer对象 private Customer customer;}以上代码建立了从Order类到Customer类的关联,同样也可以建立从C原创 2015-07-23 11:18:13 · 1168 阅读 · 0 评论