1 Hibernate持久化状态

1 持久化类的要求

Hibernate对持久化类没有太多的要求,但应该遵守如下规则

  • 提供一个无参数的构造器。只要提供了无参数的构造器,Hibernate就可以使用Constructor.newInstance来创建持久化类的实例。
  • 提供一个标识属性,标识属性通常映射数据库表的主键字段。
  • 为每个成员提供get 和set方法
  • 使用非final的类:在运行时生成代理是Hibernate的一个重要功能。如果持久化类没有实现任何借口,Hibernate使用Javassist生成代理,该代理对象就是持久化类的子类的实例。如果使用了final类,则无法生成Javassist代理,将无法进行性能优化。还有一个可选的策略,让Hibernate持久化类实现一个所有方法都声明为public的接口,这样讲JDK的动态代理。同时应避免在final类中使命public final方法。如果非要有一个public final的类,则必须通过设置lazy="fals"来明确地禁用代理
  • 重写equals()和hashCode()方法:如果需要把持久化类的实例放入set中(当需要进行关联映射时,推荐这么做),则应该为持久化类重写equals()和hashCode()方法。实现equals()和hashCode()最常用的就是比较两个对象标识符的值。如果值相同,则两个对象对应于数据库的同一行,因此他们是相等的(如果都被添加到set中,则在set中只有一个元素)。但遗憾的是,对采用自动生成标识符值的对象不能使用此方法。Hibernate只会为那些持久化对象指定标识值,一个新创建的实例将不会有任何标识值。因此,一个实例如果没有被保存过,但他又确实在一个Set中,保存它将会给这个对象赋一个标识值。如果equals()和hashCode()是基于标识值实现的,则其hashCode()返回值会发生改变,这将违反Set的规则。因此生成的equals和hashcode方法的策略,应当使用业务逻辑字段。

2 持久化对象的状态

hibernate中对象支持如下几种状态

  • 瞬态:对象由new操作符创建,且尚未与HibernateSession关联的对象被认为处于瞬态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识。如果程序中失去了瞬态对象的引用,瞬态多想将被垃圾回收机制销毁。使用HibernateSession可以将其转变化持久化状态
  • 持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识。持久化的实例可以是刚刚保存的,也可以是刚刚被加载的。无论哪一种,持久化对象都必须与指定的HibernateSession管理。Hibernate检测到处于持久化状态对象的改动,在当前操作执行完成时,将对象数据写回数据库。开发者不需要手动执行update。
  • 托管:某个实例曾经处于持久化状态,但随着与之关联的Session被关闭,该对象对变成托管状态。托管对象的引用依然有效,对象可以继续被修改。如果重新让托管对象与某个Session关联,这个托管对象会重新转换为持久化状态,而托管期间的改动不会丢失,也可被写入数据库。
1 Hibernate持久化状态_第1张图片





你可能感兴趣的:(1 Hibernate持久化状态)