博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate_持久类的要求
阅读量:7074 次
发布时间:2019-06-28

本文共 1417 字,大约阅读时间需要 4 分钟。

hot3.png

虽然Hibernate对持久类没有什么要求,但是我们还是应该要遵守如下规则:

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

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

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

#4,为持久类的每个属性提供setter和getter方法:Hibernate默认采用属性方式来访问持久化类的属性。如果持久化类有个foo属性,则应该提供setFoo()和getFoo()方法。Hibernate持久化JavaBeans风格的属性,认可如下形式的方法名:getFoo,isFoo和setFoo。如果需要,也可以切换属性的访问策略。

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

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

转载于:https://my.oschina.net/u/617909/blog/349271

你可能感兴趣的文章
nginx-1.12.2 安装| 配置文件 | 日志切割 | 启动文件
查看>>
Pycharm快捷键
查看>>
“开-闭”原则(OCP)(Java与模式笔记)
查看>>
java8之后的时间api
查看>>
驱动人生5当先锋 新装系统轻松无压力
查看>>
【unity】关于时间等常用工具类
查看>>
【Go】Linux下使用Sublime Text搭建开发环境
查看>>
Redis源码分析系列二十二: 5 time---"timeCommand"
查看>>
关于OSC项目演示平台maven的一点疑问
查看>>
ntp同步两台机器的时间
查看>>
我的友情链接
查看>>
Office365管理员操作手册-1
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
电脑端下载今日头条的短视频
查看>>
新浪微博数据爬取
查看>>
Tile chart
查看>>
我的友情链接
查看>>
php---编译安装 PHP 的 Redis 扩展
查看>>
python ---- urllib2
查看>>
Windows的定时任务(Schedule Task)设置
查看>>