一、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. ubuntu 在XP下硬盘安装

    以下选择在XP下用 grub4dos 安装 ubuntu 12.04版本 需要下载两个文件:一个是grub4dos,另一个是 ubutuntu 镜像文件 grub4dos下载地址:http://dow ...

  2. javascript 事件流及应用

    当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序发生该元素的触发 事件,事件传播的顺序叫做事件流 1.事件流的分类: A.冒泡型事件(所有浏览器都支持)   由明确的事件源到最不确定 ...

  3. mysqli扩展库操作mysql数据库

    配置环境 配置php.ini文件让php支持mysqli扩展库 extension=php_mysqli.dll 建库建表 详见博客 “mysql扩展库操作mysql数据库” 查询数据库 <?p ...

  4. C语言和C++中动态申请内存

      在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h>  ...

  5. mysql5.7版本无法启动服务问题

    cmd情况下进入mysql的bin目录后 输入命令:mysqld --initialize-insecure d:\mysql\bin

  6. C# net部署图片分布式存储服务器的小案例

    如果web服务用户多了,访问多了,用户上传的图片,文件等内容放在一块,想必服务器是承受不住的,这个时候,我们就需要考虑分布式存储的方法了. 如图所示:一个web服务器拖2个图片服务器 如何做到用户上传 ...

  7. linux JAVA JDK环境配置

    export JAVA_HOME=/usr/local/jdk1.7.0_45export JRE_HOME=/usr/local/jdk1.7.0_45/jreexport CLASSPATH=.: ...

  8. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  9. SQLite 对中文路径的支持(用到了StringToWideChar和Utf8Encode在D7的System单元中自带)

    最近用SQLITE作为数据库,发现,如果直接传递带中文路径或文件名的数据库,会导致无法打开数据库的情况.看了一下SQLITE的源码,才发现,原来SQLITE中是用UTF8编码进行文件打开操作的. 所以 ...

  10. 通过ip获取地理位置信息

    http://ipinfo.io/developers 直接使用get请求  url: http://ipinfo.io/json    即可获得json数据