Hibernate 学习入门4

本文介绍了Hibernate中持久化类的概念及其实现要点,包括持久化类的状态、生命周期管理及类设计要求等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate持久化类

持久化顾名思义就是把缓存中的东西放到数据库中使之持久.对于需要持久化的对象,它的生命周期分为三个状态:临时状态,持久化状态,游离状态.

临时状态:刚刚用new语句创建,没有被持久化,不处于session的缓存中.处于临时状态的java对象被称为临时对象.

持久化状态:已经被持久化,加入到session的缓存中.处于持久化的java对象被称为持久化对象.

游离状态:已经被持久化,但不处于session的缓存中,处于游离状态的java对象被成为游离对象.

持久化对象的特征:

.  位于一个session事例的缓存中,可以说持久化对象总是被一个session事例关联

.  持久化对象和数据库中的相关记录对应

.  Session在清理缓存时,会根据持久化对象的属性变化来同步更新数据库

.  Session的save()方法把临时状态变为持久化状态.

.  Session的update() ,saveOrUpdate()和lock()方法使游离状态变为持久化状态.

Hibernate应该遵守如下规则:

(1)提供一个无参数的构造器:所有持久化类都应该提供一个无参数的构造器,这个构造器可以不采用public访问控制符、因此提供了无参数的构造器,Hibernate就可以使用Constructor.newInstance()来创建持久化类的实例了。为了方便Hibernate在运行时生成代理,构造器的访问控制符至少是包可见的。

(2)提供了一个标识属性:标识属性通常映射数据库表的主键字段。这个属性可以是任何的原始类型、原始类型的包装类型、java.lang.String或者java.util.Date。如果使用了数据库表的联合主键,甚至可以用一个用户自定义的类,该类拥有这些类型的属性。当然,也可以不指定任何标识属性,而是在映射文件中直接将多个普通属性映射成一个联合属性,但通常不推荐这么做。

提升:虽然Hibernate可以允许持久化类没有标识符属性,而是让Hibernate内部来追踪对象的识别。但这样做将导致Hibernate许多功能无法使用。而且,Hibernate建议使用可以为空的类型来作为标识属性的类型,因此应该尽1可能避免使用基本数据类型。

(3)为持久化类的每个属性提供setter和getter方法。

(4)使用非final的类,在运行时生成代理是Hibernate的一个重要功能。如果持久化类没有实现任何接口的话,Hibernate使用CGLIB生成代理,将无法进行性能优化。还有一个可选的策略,让Hibernate持久化类实现一个所有方法都声明为public的接口,此时将使用JDK的动态代理。同时应该避免子啊非final类声明public final的方法。如果非要使用一个有public final方法的类,你必须通过设置lazy="false"来明确地禁用代理。

(5)重写equals()和hashCode()方法:如果需要把持久化类的实例放入Set中(当需要进行关联映射时,推荐这么做),则应该为持久化类重写equals()和hashCode()方法。实现equals()/hashCode()最显而易见的方法是比较两个对象标识符的值。如果值相同,则两个对象对应于数据库的同一行,因此它们是相当的。遗憾的是,对采用自动生成标识值的对象不能使用这种方法。Hibernate仅为那些持久化对象指定标识值,一个新创建的实例将不会有任何标识值。因此,如果一个实例没有被保存过,但它又确实在一个Set中,保存它将会给这个对象赋一个标识值。如果equals()和hashCode()是基于标识值实现的,则其hashCode返回值将会发生改变,这将违反Set的规则。

 

一个简单的POJO例子:

public class Employee {
   private int id;
   private String firstName; 
   private String lastName;   
   private int salary;  
 
   public Employee() {}
   public Employee(String fname, String lname, int salary) {
      this.firstName = fname;
      this.lastName = lname;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getFirstName() {
      return firstName;
   }
   public void setFirstName( String first_name ) {
      this.firstName = first_name;
   }
   public String getLastName() {
      return lastName;
   }
   public void setLastName( String last_name ) {
      this.lastName = last_name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值