Hibernate的实体规则
Posted Qiao_Zhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate的实体规则相关的知识,希望对你有一定的参考价值。
一、 hibernate的实体类有一定的规则,类似于mybatis的逆向工程导出的实体类。具体的规则以及原因如下:
1.持久化类需要提供午餐的构造方法。
因为hibernate底层采用反射机制创建对象,采用class.newInstance()创建对象,此方法默认调用无参构造方法创建对象。如果我们只写一个带参数的构造函数在查询的时候会报错误 org.hibernate.InstantiationException
2.成员变量私有,提供共有get/set方法访问.需提供属性
hibernate底层将查询到的数据采用set方法进行设置。
此处声明一个常识,一个类下声明的变量是成员变量不能说是属性,而属性说的是get/setter建造器,一个类有几个属性看这个类有几个getter/setter建造器。
3.持久化类中的属性,应尽量使用包装类型
例如int采用Integer,long采用Long。原因如下:
(1)有可能我们对一些值不需要设值,比如null,但是我们如果用int这样的基本数据类型将不能存储null,比如我们想用成绩为null表示缺考,成绩为0表示考试了但是获得 的成绩为0.
(2)数据库中的null如果映射到基本数据类型会报错误,采用包装类型可以避免这些问题。
4.持久化类需要提供oid(Object Identifier,对象标识符).与数据库中的主键列对应
注意如果没有主键的表hibernate是不能进行操作的。
数据库中的表采用ID进行区分,每条唯一的是一条记录;Java中通过内存地址区分两个对象是否是相同对象,而hibernate通过 OID进行区分,hibernate不允许在内存中出现两个相同OID的对象。
5.不要用final修饰class
hibernate使用cglib代理生成代理对象.代理对象是继承被代理对象.如果被final修饰.将无法生成代理。JDK代理采用实现接口的方式,而cgib采用继承的方式实现代理。
二、hibernate主键类型
1. 自然主键(少见)
表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用.比如用户表有身份证号字段,身份证号不能为空而且能唯一区分一条记录,则可以将身份证号作为主键。
2.代理主键(常见)
表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键。(这也是设计数据库的一条常用规则,每个表都有一个与业务无关的主键)
三、hibernate主键生成策略
以上是关于Hibernate的实体规则的主要内容,如果未能解决你的问题,请参考以下文章