【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. ...
随机推荐
- 清理SQL多余登录信息
服务器列表.登陆帐户.密码等信息都记录在 %AppData%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin (2008)%A ...
- jQuery设置checkbox全选(区别jQuery版本)
jQuery设置checkbox全选在网上有各种文章介绍,但是为什么在我们用他们的代码的时候就没有效果呢? 如果你的代码一点错误都没有,先不要急着怀疑人家代码的正确性,也许只是人家跟你用的jQuery ...
- PHP设计模式之适配器模式
将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本的由于接口不兼容而不能一起工作的那些类可以一起工作.应用场景:老代码接口不适应新的接口需求,或者代码很多很乱不便于继续修改,或者使用第三方类 ...
- Mac 配置java版本 ---- MySql数据库权限设置 --- openfire
java -version 显示java 版本 sudo su - root 切换身份 cd /usr/local/openfire 进入openfire目录 cd bin/ 进入 bin vim o ...
- C++引用之声明方法
引用就是某一变量的一个别名,对引用的操作就是对目标的操作. 引用的声明方法: 类型标识符 &引用名=目标变量名: 如: int a; int &ra=a; //定义引用ra,他是变量a ...
- ABAP写的一个递归
需求:计算下面树形结构中每个子节点与最上层父节点的对应关系. DATA:BEGIN OF lt_ztab OCCURS 0, a TYPE string, b TYPE str ...
- 【网络流24题】No.19 负载平衡问题 (费用流)
[题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input ...
- nc 命令汇总
转自: http://blog.chinaunix.net/uid-20068039-id-359170.html 1.远程拷贝文件从server1拷贝文件到server2上.需要先在server2上 ...
- google python/c++ code style naming
python: Guidelines derived from Guido's Recommendations Type Public Internal Packages lower_with_und ...
- 【HDOJ】1242 Rescue
BFS+优先级队列. #include <iostream> #include <cstdio> #include <cstring> #include <q ...