【Hibernate】--实体状体与主键生成策略
一、Hibernate三种状态
(1).瞬时状态(只存在Hibernate容器中,数据库中没有与之对应的记录)
- A.通过new实例化的实体,在没有执行save方法时。
- B.持久状态调用delete方法后。
(2).持久状态(数据库中已近存在,而且当前页存在Hibernate容器中)
- A.瞬时状态调用save方法后,没有提交事务的实体。
- B.通过hibernate查询进入Hibernate容器中的实体。
(3).脱管状态/游离状态(当实体脱离hibernate容器管理,数据库有与之对应的记录)
- A.当持久状态对象在事务提交、session执行close、clear、evict。
- B.通过update、updateOrSave、lock等方法可以变为持久状态。
二、openSession()和getCurrentSession()的区别和优缺点。
1.currentSession在Hibernate.cfg.xml中的配置:
<!--
将session和当前线程绑定,不用每次都通过sessionFactory获取session,thread使用的是JDBC事务,jta使用全局事务
-->
<property name="current_session_context_class">thread</property>
java中测试方法
public void testCurrentSession(){
//需要在hibernate配置文件中添加current_session_context_class
//getCurrentSession获取当前线程中的session,并且不用手动打开和关闭,也不需要手动设置事务
Session s = session.getCurrentSession();
// Transaction tran = s.beginTransaction();
Student stu = new Student();
stu.setSname("张三丰");
s.save(stu);
// tran.commit();
//这里不需要手动关闭,hibernate容器会管理session的状态
// s.close();
}
区别及优缺点参考博文:点击打开链接
三、主键生生成策略
- Assigned:有程序生成主键值,在save之前指定,否则会抛出异常。
特点:主键由用户指定,与顶层数据库无关,用户需要维护主键值,在调用save方法前指定主键,
注意:有程序指定主键,如果是int类型的属性不指定值默认会自动增长 (Integer等封装类型都需要指定属性值)。 - Hilo:使用高地位算法生成主键
特点:需要二外表支持,能保证同一数据库中主键的唯一性,当不能保证多个数据库之间主键的唯一性,由hibernate维护与底层数据库无关。
注意:不能手动修改,否则会抛异常。 - Increment:对主键采取自增的方式生成新的主键,需要底层数据库支持Sequence,如Oracle、DB2。
特点:hibernate本身维护,适用于所有数据库。
注意:不适合于多并发的数据库,适合单一进程访问,不能用于集群环境。 - Identity:根据底层数据库来支持自动增长,不同数据库用不同的增长方式。
特点:与底层数据库有关,适用MySQL、DB2、MSSQL,适用long、int、short类型生成唯一标识。
注意:hibernate和用户干涉,适用非常方便,但是程序在不同数据库上移植比较麻烦。 - Sequence:需要底层数据库支持Sequence方式,如Oracle数据库等特点:需要底层数据库支持序列,支持的数据库有Oracle、PostgreSql、DB2、SAPDb等。
注意:在不同数据库之间移植,特别是不支持序列的数据库上,需要修改配置文件。 - Native:生成方式会根据底层不同的数据库选择Identity、Sequence、Hilo主键生成方式。
特点:更具不同的底层数据库采用不同的生成方式,hibernate会更具底层数据库采用不同的映射方式。
注意:在项目中如果采用多个数据库时,可以使用这种方式,方便程序移植。 - uuid:使用128位uuid算法生成主键,保证网络环境下主键唯一,也能保证不同数据库不同服务器下主键唯一。
特点:能够保证数据库中主键唯一,生成的朱主键占用比较多的存储空间。
注意:必须是一个字符串类型的,长度必须大于32.xml配置即说明如下:
<id name="sid" type="java.lang.String" length="50">
<column name="s_id" />
<!-- assigned 有程序指定主键,如果是int类型的属性不指定值默认会自动增长
<generator class="assigned"/>
--> <!-- hilo 使用高地位算法生成主键 ,max_lo高位值
<generator class="hilo">
<param name="table">hi_value</param>
<param name="colum">next_hi</param>
<param name="max_lo">125</param>
</generator>
-->
<!-- increment适用数据库自增新的主键,如Oracle、DB2
<generator class="increment"/>
--> <!-- identity根据底层数据库来支持自动增长
<generator class="identity"/>
--> <!-- 需要底层数据库支持Sequence方式
<generator class="sequence"/>
--> <!-- 根据底层不同的数据库选择Identity、Sequence、Hilo主键生成方式
<generator class="native"/>
--> <generator class="uuid.hex"/>
</id>
【Hibernate】--实体状体与主键生成策略的更多相关文章
- hibernate的持久化类、主键生成策略
一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...
- Hibernate遇到oracle之主键生成策略
一直用Hibernate+mysql,感觉Hibernate很好用,也出过什么大问题:这周,公司的产品要部署到Orecle,虽然产品号称支持Oracle但是我自己知道,这个产品压根儿就没在Oracle ...
- Hibernate的实体规则、主键生成策略、对象状态
一. hibernate的实体类有一定的规则,类似于mybatis的逆向工程导出的实体类.具体的规则以及原因如下: 1.持久化类需要提供无参的构造方法. 因为hibernate底层采用反射机制创建对象 ...
- Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...
- hibernate 注解 主键生成策略
一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...
- Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略
一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...
- hibernate(二)主键生成策略
hibernate主键生成策略主要指的是在实体类orm的配置 <id name=""> <generator class="native"&g ...
- hibernate框架学习笔记4:主键生成策略、对象状态
创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...
- Hibernate框架笔记02_主键生成策略_一级缓存_事务管理
目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...
随机推荐
- javascript 事件对象
1.事件对象 用来记录一些事件发生时的相关信息的对象 A.只有当事件发生的时候才产生,只能在处理函数内部访问 B.处理函数运行结束后自动销毁2.如何获取事件对象 IE: window.even ...
- 2014年度辛星html教程夏季版第三节
接下来我们继续学习HTML中的标签,希望大家能够再接再厉,同时辛星也会支持大家,我们一起努力,一起加油.我们本小节来认识另外几个标签. *************空格和换行************** ...
- 配置mybatis错误总结
### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderExce ...
- 转 Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ...
- RSA算法原理及实现
参考资料: 阮哥的日志:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html http://www.ruanyifeng ...
- Js处理json数据
js中处理由ajax调用返回的json数据问题,可以通过使用JSON.parse方法将json字符串转化成javascript 对象.通过对象访问属性值. JSON.parse 只限于高版本的浏览器. ...
- 第 3 章 单例模式【Singleton Pattern】
以下内容出自:24种设计模式介绍与6大设计原则 这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除 ...
- bzoj 3720: Gty的妹子树 块状树
3720: Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 412 Solved: 153[Submit][Status] Descr ...
- eclipse中配置c++开发环境 Eclipse + CDT + MinGW
转自eclipse中配置c++开发环境 Eclipse + CDT + MinGW 基本框架:Eclipse + CDT + MinGW 背景知识: CDT:CDT 是完全用 Java 实现的开放源码 ...
- PCB 敷铜间距规则(转)
第一优先规则: First Object = InPolygon, Second Object = All 第二优先规则:First Object = All, Second Object = All ...