【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. ...
随机推荐
- ubuntu 在XP下硬盘安装
以下选择在XP下用 grub4dos 安装 ubuntu 12.04版本 需要下载两个文件:一个是grub4dos,另一个是 ubutuntu 镜像文件 grub4dos下载地址:http://dow ...
- javascript 事件流及应用
当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序发生该元素的触发 事件,事件传播的顺序叫做事件流 1.事件流的分类: A.冒泡型事件(所有浏览器都支持) 由明确的事件源到最不确定 ...
- mysqli扩展库操作mysql数据库
配置环境 配置php.ini文件让php支持mysqli扩展库 extension=php_mysqli.dll 建库建表 详见博客 “mysql扩展库操作mysql数据库” 查询数据库 <?p ...
- C语言和C++中动态申请内存
在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h> ...
- mysql5.7版本无法启动服务问题
cmd情况下进入mysql的bin目录后 输入命令:mysqld --initialize-insecure d:\mysql\bin
- C# net部署图片分布式存储服务器的小案例
如果web服务用户多了,访问多了,用户上传的图片,文件等内容放在一块,想必服务器是承受不住的,这个时候,我们就需要考虑分布式存储的方法了. 如图所示:一个web服务器拖2个图片服务器 如何做到用户上传 ...
- linux JAVA JDK环境配置
export JAVA_HOME=/usr/local/jdk1.7.0_45export JRE_HOME=/usr/local/jdk1.7.0_45/jreexport CLASSPATH=.: ...
- 【HDU 2853】Assignment (KM)
Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...
- SQLite 对中文路径的支持(用到了StringToWideChar和Utf8Encode在D7的System单元中自带)
最近用SQLITE作为数据库,发现,如果直接传递带中文路径或文件名的数据库,会导致无法打开数据库的情况.看了一下SQLITE的源码,才发现,原来SQLITE中是用UTF8编码进行文件打开操作的. 所以 ...
- 通过ip获取地理位置信息
http://ipinfo.io/developers 直接使用get请求 url: http://ipinfo.io/json 即可获得json数据