hibernate_持久化类、主键生成策略

来源:互联网 发布:巫师3上古卷轴5 知乎 编辑:程序博客网 时间:2024/06/08 07:55

1. 什么是持久化类?
 所谓的持久化类就是:实体类+映射文件

2. 持久化类的编写规范
<1>提供一个无参数 public访问控制符的构造器
 因为在底层当中会用到反射技术,所以要提供一个无参公共构造,类似javabean一样。

<2>提供一个标识属性,映射数据表主键数据
 因为hibernate需要区分持久化对象是否为同一个,就必须考这个标识。这种机制在java和数据库中也有。Java区分两个对象是否为同一个对象是根据地址来进行比较的。而在数据库当中,则是根据ID来确定两个记录是否为同一条记录。

<3>所有属性提供public权限的get/set方法
 为了在框架中进行存值和取值的时候使用。

<4>标识属性应尽量使用基本数据类型的包装类型
 因为基本数据类型和基本数据的包装类型的默认值不同。
拿个例子来讲:

//成绩表:学号      姓名      成绩1       张三      02       李四      null//如果使用的是基本类型,那么我们就无法区分张三是因为参加考试才得的零分,还是参加考试了,得分就是零分。如果使用的是包装类型,那么我们就能知道0就是考试考了0分,null就是没来考试。

<5>持久化类不能用final修饰
 用final修饰的类不能被继承,那马hibernate框架就无法为其生成代理对象。(延迟加载的时候返回代理对象.延迟加载就失效.)

3. 主键
 在建表的时候,经常对主键进行区分。主键分为两种:
<1>自然主键
 创建一个人员表。人员表中某条记录唯一确定。比如人都有身份证号,我们可以使用身份证号作为主键.(身份证号本身就是人员的一个属性.作为主键.)

<2>代理主键
 创建一个人员表。人员表中某条记录唯一确定.。但是没有使用身份证号作为主键,新建字段(用新建的字段作为主键.只是一个标识作用.)

4. 主键的生成策略配置
 我们在使用hibernate框架的过程中,尽量让hibernate自己去维护主键。
 在映射文件的id下的generator标签中进行配置。
例如:

<hibernate-mapping>     <class name="cn.itcast.hibernate3.demo1.Customer" table="customer">        <id name="id" column="id">            <generator class="assigned"/>        </id>        <property name="name" column="name" type="string" length="20"/>        <property name="age" column="age"/>         </class>    </hibernate-mapping>

5. 主键的生成策略类别
<1>increment
 自动增长,适合整形数据。不是使用数据库的自动增长机制.使用Hibernate框架提供的自动增长方式。
原理:select max(id) from 表; 在最大值的基础上+1.(多线程的问题.)在集群下不要使用。

<2>identity
 自动增长,适合整形数据。采用数据库的自动增长机制,不适合于Oracle数据库。

<3>sequence
 序列,适用于整形数据。可以应用在Oracle中,但不能应用于MySQL中。

<4>uuid
 适用于字符串类型的主键。采用随机的字符串作为主键。

<5>native
 本地策略。底层数据库不同.自动选择适用identity 还是 sequence。

<6>assigned
 Hibernate框架不维护主键,主键由程序自动生成。必须自己手动添加id。

<7>foreign
 主键的外来的,比如是别的表的属性。(应用在多表一对一的关系.)

阅读全文
0 0