Hibernate对象标识符
Hibernate提供的内置标识符生成器
Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录。Hibernate使用OID(对象标识符)来统一两者之间的矛盾,OID是关系数据库中的主键(通常称为代理主健)在Java对象模型中的等价物。
在对象-关系映射文件中,<id>元素用来设置对象标识符,比如:
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
<generator>元素用来设定标识生成器。Hibernate提供了标识符生成器接口: org.hibernate.id.IdentifierGenerator接口;并且提供了多种内置的实现。例如: org.hibernate.id.IdentityGenerator;org.hibernate.id.IncrementGenerator;它们的缩写名分别为:identity和increment。在设置<generator>子元素的class属性时,既可以提供完整的标识符生成器的类名,也可以给定缩写名,因此以下两种方式是等价的。
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="org.hibernate.id.IdentityGenerator" />
</id>
或者:
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
标识符生成器 |
说 明 |
increment |
适用于代理主键。由Hibernate自动以递增的方式生成标识符,每次增加1。 |
identity |
适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型。(oracle数据库不能用它) |
sequence |
适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列。(oracle数据库能用它) |
hilo |
适用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为"high"值.在默认情况下选用hibernate_unique_key表的next_hi字段。它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。high/low算法生成的标识符只能在一个数据库中保证唯一。 |
native |
适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence, hilo。很适合于跨平台开发,即同一个Hibernate应用需要连接多种数据库系统。 |
uuid.hex |
适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。UUID算法能够在网络环境中生成唯一的字符串标识符。这种标识符生成策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。 |
assigned |
适用于自然主键。由Java应用程序负责生成标识符,为了能让Java应用程序设置OID,不能把setID()方法声明为private类型,应该尽量避免使用自然主键。 |
1 代理主键:
注意: 不具有义务含义,所以它可以适应不断变化的业务需求,它通常为整数类型,比如short、long、int,以及它们的包装类型。
2 自然主键:
具有业务含义。
3 几种常用数据库系统中可使用的标识符生成器:
MYSQL:identity、increment、hiho、native
MS SQL Server:identity、increment、hiho、native
Oracle:sequence、identity、increment、hiho、native
跨平台开发:native
几个例子:
1、如果主键字段为自增类型,
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其实这个native并非实际的类型,而是hiberante根据
当前使用的数据库,自动使用对应的类型。
例如:如果sqlserver,native就对应identity
见Hiberante参考:
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
2、如果主键字段不设置为自增,但是int型的
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。
见hiberante参考:
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。
在集群下不要使用。
3、如果使用uuid.hex产生的随机32位数最为主键
那么数据库的id字段类型为char,长度为32
hbm.xml中写为: <generator class="uuid.hex" />
另外,uuid.string也是功能类似。
uuid.hex产生的是32位的16进制数字的字符串。
而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中
转载于:https://www.cnblogs.com/superws/p/5832057.html
Hibernate对象标识符相关推荐
- Hibernate学习3—映射对象标识符(OID)
一.Hibernate 用对象标识符(OID)来区分对象 作如下代码的实验: public class StudentTest {public static void main(String[] ar ...
- hibernate.hbm.xml配置文件解析
转自:https://www.cnblogs.com/uoar/p/6670612.html 1. 1 <!DOCTYPE hibernate-mapping PUBLIC "-//H ...
- Spring Boot 、Spring Data JPA、Hibernate集成
###什么是JPA JPA是用于管理Java EE 和Java SE环境中的持久化,以及对象/关系映射的JAVA API 最新规范为"JSR 338:Java Persistence 2.1 ...
- Hibernate配置详解
一.简单介绍 Hibernate是一种对JDBC做了轻量级封装的对象---关系映射工具,所谓轻量级封装,是指Hibernate并没有完全封装JDBC,Java应用即可以通过Hibernate ...
- Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!
1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...
- Hibernate学习(二)
持久化对象的声明周期 1.Hibernate管理的持久化对象(PO persistence object )的生命周期有四种状态,分别是transient.persistent.detached和re ...
- Hibernate 之单向多对一映射及其衍生问题
由于在数据表之间可以通过外键进行关联,在使用Hibernate操作映射到存在关联关系的数据表的对象时,需要将对象的关联关系与数据表的外键关联进行映射. 首先建立hibernate.cfg.xml和会话 ...
- hibernate中的映射文件xxx.hbm.xml详解总结
一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容: (1).映射内容的定义: Hibern ...
- Hibernate之对象关系映射文件
一.对象关系映射文件 POJO类和关系数据库之间的映射可以用一个XML文档来定义 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 映射文件的拓展名为 .hbm.xml 1.映射文件说 ...
- Hibernate提供的内置标识符生成器
Hibernate提供的内置标识符生成器 Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录.Hibernate使用OID(对象标识符)来统一两者之 ...
最新文章
- linux php环境升级,php5.6升级到php7.1.10(Linux环境)
- Spring-boot+Vue = Fame 写blog的一次小结
- Dubbo和Spring Cloud微服务架构对比
- VSFTP之不能登录
- 【C 语言】字符串模型 ( strstr-while 模型 )
- 云数据保护需要增强应对复杂环境的能力
- 【强化学习】强化学习专栏上线,60多篇文章等你follow
- Java设计模式之创建型:单例模式
- redis nosql_Redis教程:NoSQL键值存储
- android monitor不能查看/data目录
- 尝试Office 2003 VSTO的开发、部署
- spring下jndi配置
- Visual Studio 2005结合Direct 9.0 SDK(Aug2007)时应该注意的事项
- 计算机控制技术摘要,计算机控制技术摘要.ppt
- Cookie和Session专题
- 【ihaonet微测试】你出题,我开发
- matlab有限元分析教程,Matlab做有限元分析
- 科技人才开发效率的空间杜宾模型分析
- jQuerry实现CSS动画样式跳跃显示
- postman脚本批量请求
热门文章
- php封装函数输出,php函数封装
- linux系统交换空间,Linux中如何使用和管理交换空间
- java 数据包含_java – 包含大量数据库表的通用实现
- 【Ubuntu】deepin安装QQ WeChat
- MySQL 基数的定义
- 为什么说红黑树是“近似平衡”的?
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程...
- CentOS和AIX查看系统序列号
- HTML+CSS 模仿Windows 7 桌面效果
- hpasmcli查看HP服务器内存状态