摘要:
在使用Hibernate的过程我们会遇到多个人对同一数据同时进行修改,这个时候就会发生脏数据,造成数据的不一致性。为了避免更新数据的丢失,Hibernate采用锁机制。 Hibernate提供了两种锁机制:悲观锁和乐观锁。 悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改。 乐观锁:在对数据进行修改的时候,对数据采用版本号或者时间戳等方式来比较,数据是否一致性来实现加锁。一、悲观锁 悲观锁是依靠数据库提供的锁机制。Hibernate是通过使用数据库的forupdate子句实现了悲观锁机制。 Hibernate有如下五种加锁机制 1、LockMode.NONE. 阅读全文
摘要:
Hibernate执行持久化过程中,应用程序无法参与其中。所有的数据持久化操作,对用户都是透明的。 通过事件框架,Hibernate允许应用程能响应特定的内部事件,从而允许实现某些通用的功能或者对Hibernate功能进行扩展。 Hibernate的事件机制框架由两个部分组成: 1、拦截器机制:对于特定动作拦截,回调应用中的特定动作 2、事件系统:重写Hibernate的事件监听器。一、拦截器 Interceptor接口提供了从会话回调应用程序的机制,这种回调机制可以允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其属性。 通过Interceptor接口,可以在数据进. 阅读全文
摘要:
缓存的作用主要是用来提高hibernate的性能,可以简单的理解成一个map。使用缓存涉及到三个操作:把数据放入缓存、从缓存中取数据、删除缓存中的无效数据。一、一级缓存一级缓存是Session级共享的。对于一级缓存而言,所有经过Session操作的实体,不管是使用save()、upadate()或者saveOrUpdate保存一个对象,还是使用load()、get()、list()、iterate()、scroll()方法获得一个对象时,该对象都将被放入一级缓存中。1 session = HibernateUtil.getSession();2 ... 阅读全文
摘要:
懒加载是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。一、load方法的懒加载先看如下代码段 1 public class UserManager { 2 3 public static void main(String[] args) { 4 Users user = new Users(); 5 user.setBirthday(new Date()); 6 7 Name name = new Name(); 8 name.setFirstName(... 阅读全文
摘要:
Hibernate3提供了一种创新的方式来处理具有“显性(visibility)”规则的数据,那就是使用Hibernatefilter。Hibernatefilter是全局有效的、具有名字、可以带参数的过滤器,对于某个特定的Hibernatesession您可以选择是否启用(或禁用)某个过滤器。 一旦启用了数据过滤器,则不管是数据查询,还是数据加载,该过滤器将自动作用于所有数据,只有满足过滤条件的记录才会被选出来。 过滤器条件相当于定义一个非常类似于类和各种集合上的“where”属性的约束子句,但是过滤器条件可以带参数。应用程序可以在运行时决定是否启用给定的过滤器,以及使用什么样的参数值。过. 阅读全文
摘要:
条件查询一般是通过以下三个类完成的: 1、Criteria:代表一次查询 2、Criterion:代表一个查询条件 3、Restriction:代表查询条件的工具类 执行条件查询的步骤如下: 1、获得Hibernate的Session对象 2、以Session对象创建Criteria对象3、使用Restriction的静态方法创建Criterion查询条件 4、向Criteria查询中添加Criterion查询条件 5、执行Criterion的list()方法或者uniqueResult()方法返回结果集 示例: 1 public void query(){ 2 Se... 阅读全文
摘要:
Hibernate除了支持HQL查询外,还支持原生SQL查询。 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。 执行SQL查询步骤如下: 1、获取HibernateSession对象 2、编写SQL语句 3、通过Session的createSQLQuery方法创建查询对象 4、调用SQLQuery对象的addScalar()或addEntity()方法将选出的结果与标量值或实体进行关联,分别用于进行标量查询或实体查询 5、如果SQL语句包含参数,调用Query的setXxxx方. 阅读全文
摘要:
Hibernate提供了强大的查询系统,使用Hibernate有多种查询方法可以选择:可以使用Hibernate的HQL查询,也可以使用条件查询,甚至可以使用原生的SQL查询语句。其中HQL查询时Hibernate配置的功能强大的查询语句。HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。一、HQL查询HQL的语法和SQL很相似,但是HQL是一种面向对象的查询语句,它的操作对象是类、实例、属性等,而SQL的操作对象是数据表、列等数据库对象。由于HQL是完全面向对象的查询语句,因此可以支持继承、多态等特性。HQL查询依赖于Query类,每一个Query实例对 阅读全文
摘要:
Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象,将被自动转换为对数据库的操作。但存在这样一个问题,如果我们想同时更新100000条记录,是不是要逐一加载100000条记录,然后依次调用setter方法。采用这种方法实在是太繁琐了,而且严重影响了数据的访问性能。Hibernate提供的批量处理的方案来解决这个问题。一、批量插入 如果我们需要插入100000条记录,通过hibernate可能会采用如下的方式处理: 1 Session session = HibernateUtil.getSession(); 2 Tran... 阅读全文
摘要:
对于面向对象的程序设计语言,继承、多态是两个最基本的概念。Hibernate的继承映射可以理解两个持久化类之间的继承关系。 Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hibernate的多态查询都可以很好的运行。 假设有四个对象:Department、Employee、Skiller、Sales。他们四个对象存在如下关系: 从上面的关系可知:Employee与Department之间存在N-1的关联关系。Skiller和Sales都是Employee的子类。下面是这四个类的代码: Department1 public class Department {2 pri... 阅读全文
摘要:
先看User持久化类: 1 public class Users { 2 private int id; 3 private Date birthday; 4 private Name name; 5 6 public int getId() { 7 return id; 8 } 9 10 public void setId(int id) {11 this.id = id;12 }13 14 public Date getBirthday() {15 return birthd... 阅读全文
摘要:
四、N—N关联关系1.1单向N-N的关联单向的N-N关联和1-N关联的持久化类完全一样,控制关系的一端需要增加一个set集合属性,被关联的持久化实例以集合的形式存在。 N-N关联必须使用连接表,N-N关联与有连接表的1-N关联非常相似,只需要去掉<many-to-many.../>元素的unique="true"即可。其他的配置和1-N关联一样。 由于与1-N关联非常相似,这里就不演示了。1.2双向N-N的关联 对于双向的N-N关联,我们只需要转换为两个1-N关联模型即可。双向N-N关联两端都需要使用set集合属性,两端都增加对集合属性的访问。双向N-N同样必须 阅读全文
摘要:
三、1—N 对于1-N而言,它的持久化类发生了一点改变,持久化类里需要使用集合属性。因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现。1、单向1-N关联 对于单向的1-N关联关系,只需要在1的一端增加Set类型的属性,该属性记录当前实体的关联实体。 同样以员工-部门为例(Employee-->Department)。两个持久化类如下: Department 1 public class Department { 2 private Integer id; 3 private String name; 4 private Set<Employee> e... 阅读全文
摘要:
二、1—1 无论是单向1-1映射关联,还是双休1-1映射关联,都有三种映射策略:基于主键、基于外键、采用连接表。 1、单向1-1映射关联 1.1、基于主键的单向1-1映射关联 对于基于主键的单向1-1关联,基于主键关联的持久化类不能拥有自己的主键生成器策略,它的主键由关联实体来负责生成。 是根据他自己的person属性来获得的。即他通过自身的一个getPerson()方法来获得Person对象。然后通过Person对象中的getID()方法获得id,然后赋值给自身id。这样就可以不需要自己来生成id。 采用基于主键的1-1关联时,应使用<one-to-one.../>元素来映射关联 阅读全文
摘要:
我们所生活的世界很少有事物是孤立存在的,每个事物必然会存在着与它相关联的事物。在面向对象设计当中,关联关系是非常重要的。关联关系一般可以分为以下两种: 单向关系:只需单向访问关联端 双向关系:关联的两端都可以互相访问 单向关系可分为:1—N、1—1、N—1、N—N 双向关系可分为:1—1、1—N、N—N 下面就上面的每种关联映射分别讲解:一、N—1关联映射1、单向N—1关联 1.1、无连接表的N-1关联(基于外键的N-1关联) 对于单向的N—1关联而言只需要从N的一端可以访问1的一端。为了让这个两个持久化类支持这种关联映射,程序应该在N的一端的持久化类中增加一个熟悉,该属性引用1一端的关联实. 阅读全文
摘要:
Hibernate采用低侵入式的设计,它对持久化类几乎不做任何要求。也就是说hibernate操作的持久化类基本都是普通java对象。对于持久化类的要求这里不做说明。只就持久化对象的状态和各个状态之间的转换。 Hibernate持久化对象有如下几种状态: 1、瞬态:对象有new操作符创建,但是并没与HibernateSession关联。处于瞬态的对象是不会被持久化到数据库中的。如果程序中失去了瞬态对象的引用,瞬态对象就会被垃圾回收机制销毁。 2、持久化:持久化实力在数据库中有对应的记录,并且拥有一个持久化标识。对于持久化对象,它必须要与指定的HibernateSession关联起来。 3、托. 阅读全文
摘要:
上一篇波博客我部署的第一个hibernate工程,现在就这个工程里面的细节来分析下。 一、POJO类 POJO类即持久化对象。他是完成hibernate持久化操作。说本质点就是简单的java类。但是并不是所有的java类都可以是POJO的。对于这个java类它是有如下几个限制:1、它必须存在默认的构造方法 如果存在带参数的构造方法,那么hibernate就不能管理这个pojo了。2、有无意义的标示符id 这个是可选的。这个id和表里面的主键是相对应的。一般来说hibernate是建议有这个属性id的。因为这样hibernate操作就会更加方便和高效率。3、这个类应该是非final的 如果某个. 阅读全文
摘要:
在介绍hibernate之前我们有必要的简单了解一下ORM 目前的主流数据库依然是关系型数据库,但是java则是面向对象的编程语言,当把两者结合在一起使用时非常麻烦。这时便催生了ORM框架的产生。ORM,全称为Object/RelationMapping,即对象/关系数据库映射,我们可以把他理解成一种规范。它完成面向对象的编程语言到关系数据库的映射。因此,我们可以把ORM框架作为面向对象编程语言到数据库之间的桥梁。当我们采用ORM框架之后,应用程序不再直接访问数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转化为底层的SQL操作。所以我们可以把ORM的作用理解. 阅读全文