一、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();
}

区别及优缺点参考博文:点击打开链接

三、主键生生成策略

  1. Assigned:有程序生成主键值,在save之前指定,否则会抛出异常。
    特点:主键由用户指定,与顶层数据库无关,用户需要维护主键值,在调用save方法前指定主键,
    注意:有程序指定主键,如果是int类型的属性不指定值默认会自动增长 (Integer等封装类型都需要指定属性值)。
  2. Hilo:使用高地位算法生成主键
    特点:需要二外表支持,能保证同一数据库中主键的唯一性,当不能保证多个数据库之间主键的唯一性,由hibernate维护与底层数据库无关。
    注意:不能手动修改,否则会抛异常。
  3. Increment:对主键采取自增的方式生成新的主键,需要底层数据库支持Sequence,如Oracle、DB2。
    特点:hibernate本身维护,适用于所有数据库。
    注意:不适合于多并发的数据库,适合单一进程访问,不能用于集群环境。
  4. Identity:根据底层数据库来支持自动增长,不同数据库用不同的增长方式。
    特点:与底层数据库有关,适用MySQL、DB2、MSSQL,适用long、int、short类型生成唯一标识。
    注意:hibernate和用户干涉,适用非常方便,但是程序在不同数据库上移植比较麻烦。
  5. Sequence:需要底层数据库支持Sequence方式,如Oracle数据库等特点:需要底层数据库支持序列,支持的数据库有Oracle、PostgreSql、DB2、SAPDb等。
    注意:在不同数据库之间移植,特别是不支持序列的数据库上,需要修改配置文件。
  6. Native:生成方式会根据底层不同的数据库选择Identity、Sequence、Hilo主键生成方式。
    特点:更具不同的底层数据库采用不同的生成方式,hibernate会更具底层数据库采用不同的映射方式。
    注意:在项目中如果采用多个数据库时,可以使用这种方式,方便程序移植。
  7. 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】--实体状体与主键生成策略的更多相关文章

  1. hibernate的持久化类、主键生成策略

    一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...

  2. Hibernate遇到oracle之主键生成策略

    一直用Hibernate+mysql,感觉Hibernate很好用,也出过什么大问题:这周,公司的产品要部署到Orecle,虽然产品号称支持Oracle但是我自己知道,这个产品压根儿就没在Oracle ...

  3. Hibernate的实体规则、主键生成策略、对象状态

    一. hibernate的实体类有一定的规则,类似于mybatis的逆向工程导出的实体类.具体的规则以及原因如下: 1.持久化类需要提供无参的构造方法. 因为hibernate底层采用反射机制创建对象 ...

  4. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

  5. hibernate 注解 主键生成策略

    一.JPA通用策略生成器       通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue ...

  6. Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略

    一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...

  7. hibernate(二)主键生成策略

    hibernate主键生成策略主要指的是在实体类orm的配置 <id name=""> <generator class="native"&g ...

  8. hibernate框架学习笔记4:主键生成策略、对象状态

    创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...

  9. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

随机推荐

  1. [转]Android应用的自动更新

    软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很 ...

  2. HTML5 改良的 input 元素的种类

    html5中增加改良的input 元素 . 在过去我们制作网页输入框,会用到不少JS验证,如今有了HTML5写这种效果已经没有那么麻烦了,下面我来给大家介绍两种HTML5的input的新增加的类型应用 ...

  3. poco异步等待ActiveResult

    #include "Poco/ActiveMethod.h"#include "Poco/ActiveResult.h"#include <utility ...

  4. 跨线程操作UI控件

    写程序的时候经常会遇到跨线程访问控件的问题,看到不少人去设置Control.CheckForIllegalCrossThreadCalls = false;这句话是告诉编译器不要对跨线程访问作检查,可 ...

  5. 7个热门开源PHP框架

    PHP(Hypertext Preprocessor)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点.虽然有很多其它可供选择的Web开发语言,像:ASP 和Ruby,但是PHP是目 ...

  6. 【转载】C# HttpWebRequest 发送SOAP XML

    调用webservice的几种方法: 方法一:添加web引用(简单/方便 局限客户端是.net) 方法二:Post xml(本文重点讲述) 方法三:使用微软MSXML2组件(好像在window ser ...

  7. BZOJ 1690: [Usaco2007 Dec]奶牛的旅行

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...

  8. Creating Shazam in Java

    A couple of days ago I encountered this article: How Shazam Works This got me interested in how a pr ...

  9. HTML5安全:CORS(跨域资源共享)简介

    前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Google上搜索CORS,搜到的中文文章基本都是另外一种卫星定位技术CORS的介绍,让我等前端同学情何以堪(对 ...

  10. JavaScript 将字符串转化为json对象

    var json = eval('(' + data + ')'); 其中data为字符串数据