Hibernate -- 持久化类的编写原则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Oktfolio/article/details/79418927

什么是持久化类:

Hibernate 是持久层的 ORM 映射框架,专注于数据的持久化工作。所谓持久化,就是将内存中的数据永久存储到关系数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实所谓的持久化类指的是一个 Java 类与数据库表建立了映射关系,那么这个类称为持久化类。其实你可以简单的理解为持久话类就是一个 Java 类有了一个映射文件与数据库的表建立了关系。

持久化类的编写规则

  • 持久类提供无参构造方法
    因为在 Hibernate 的底层需要使用反射生成类的实例。
  • 成员变量私有,提供共有 setter/geter 方法访问。需提供属性
    因为在 Hibernate 底层会将查询到的数据进行封装。
  • 持久类中的属性应尽量使用包装类型。(int Integer, long Long …)
  • 持久化类需要提供 OID,与数据库中的主键列对应
    因为 Hibernate 中需要通过这个唯一标识 OID 区分内存中是否是同一个持久类。在 Java 中通过地址区分是否是同一个对象,在关系数据库的表中是通过主键区分是否是通一条记录。那么 Hibernate 就是通过这个 OID 来进行区分的。Hibernate 是不允许在内存中出现两个 IOD 相同的持久化对象。如果一张表没有主键,那么是无法通过 Hibernate 进行映射的。
  • 持久化类尽量不不要使用 final 进行修饰。
    因为 Hibernate 中有延迟加载的机制,这个机制中会产生代理对象,Hibernate 产生代理对象使用的是字节码的增强技术完成的,其实就是产生了当前类的一个子类对象实现的。如果使用了 final 修饰持久化类。那么就不能产生子类,从而就不会产生代理对象,那么 Hibernate 的延迟加载策略(是一种优化手段)就会失效。
  • 重写 equals() 和 hashCode() 方法
    如果需要把持久化类的实例放入 Set 中(当需要进行关联映射时,推荐这么做),则应该为该持久化类重写 equals() 和 hashCode() 方法。实现 equals() 和 hashCode() 方法最显而易见的方法时比较两个对象标识属性的值。如果值相同,则两个对象对应于数据库的同一行,因此它们时相等的(如果都被添加到 Set 中,则 Set 中只有一个元素)。遗憾的是,对采用自动生成标识值的对象不能使用这种方法。Hibernate 仅为那些持久化对象指定标识值。因此,如果一个实例没有被保存过,但它又确实在一个 Set 中,那么保存它将会给这个对象赋一个标识值。如果 equals() 和 hashCode() 是基于标识值实现的,则其 hashCode 返回值会发生改变,这将违犯 Set 规则。
展开阅读全文

没有更多推荐了,返回首页