Hibernate配置文件中映射元素详解
对象标识符号
在关系数据库表中,主键(Primary Key)用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两个变量引用的对象值是否相同来判断两对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。如下代码所示,三次调用了Session的load()方法,分别加载OID为1或3的User对象。
|
Transaction tx = session.beginTransaction(); User user1 = (User)session.load(User.class,new Long(1)); User user2 = (User)session.load(User.class,new Long(1)); User user3 = (User)session.load(User.class,new Long(3)); System.out.println( user1 == user2 ); System.out.println( user1 == user3 ); |
应用程序在执行上述代码时,第一次加载OID为1的User对象,从数据库中查找ID为1的记录,然后创建相应的User实例,并把它保存在Session缓存中,最后将该实例的引用赋值给变量user1。第二次加载OID为1的对象时,直接把Session缓存中OID为1的实例的引用赋值给变量user2。因此,表达式user1==user2的结果为true。
标识的生成可以使用不同的策略,表1为Hibernate内置的标识生成策略。
表1:Hibernate标识生成策略
| 标识符生成器 | 描述 |
| increment | 适用于代理主键。由Hibernate自动以递增方式生成。 |
| identity | 适用于代理主键。由底层数据库生成标识符。 |
| sequence | 适用于代理主键。Hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列。 |
| hilo | 适用于代理主键。Hibernate分局high/low算法生成标识符。 |
| seqhilo | 适用于代理主键。使用一个高/低位算法来高效的生成long,short或者int类型的标识符。 |
| native | 适用于代理主键。根据底层数据库对自动生成标识符的方式,自动选择identity、sequence或hilo。 |
| uuid.hex | 适用于代理主键。Hibernate采用128位的UUID算法生成标识符。 |
| uuid.string | 适用于代理主键。UUID被编码成一个16字符长的字符串。 |
| assigned | 适用于自然主键。由Java应用程序负责生成标识符。 |
| foreign | 适用于代理主键。使用另外一个相关联的对象的标识符。 |
Hibernate映射类型
在对象/关系映射文件中,Hibernate采用映射类型作为Java类型和SQL类型的桥梁。Hibernate映射类型分为2种:内置映射类型和自定义映射类型。
1、内置映射类型
Hibernate对所有的Java原生类型、常用的Java类型如String、Date等都定义了内置的映射类型。表2列出了Hibernate映射类型、对应的Java类型以及对应的标准SQL类型。
表2:Hibernate内置映射类型
| Hibernate映射类型 | Java类型 | 标准SQL类型 | 大小 |
| integer/int | java.lang.Integer/int | INTEGER | 4字节 |
| long | java.lang.Long/long | BIGINT | 8字节 |
| short | java.lang.Short/short | SMALLINT | 2字节 |
| byte | java.lang.Byte/byte | TINYINT | 1字节 |
| float | java.lang.Float/float | FLOAT | 4字节 |
| double | java.lang.Double/double | DOUBLE | 8字节 |
| big_decimal | java.math.BigDecimal | NUMERIC | |
| character | java.lang.Character/java.lang.String/char | CHAR(1) | 定长字符 |
| string | java.lang.String | VARCHAR | 变长字符 |
| boolean/ yes_no/true_false | java.lang.Boolean/Boolean | BIT | 布尔类型 |
| date | java.util.Date/java.sql.Date | DATE | 日期 |
| timestamp | java.util.Date/java.util.Timestamp | TIMESTAMP | 日期 |
| calendar | java.util.Calendar | TIMESTAMP | 日期 |
| calendar_date | java.util.Calendar | DATE | 日期 |
| binary | byte[] | BLOB | BLOB |
| text | java.lang.String | TEXT | CLOB |
| serializable | 实现java.io.Serializablej接口的任意Java类 | BLOB | BLOB |
| clob | java.sql.Clob | CLOB | CLOB |
| blob | java.sql.Blob | BLOB | BLOB |
| class | java.lang.Class | VARCHAR | 定长字符 |
| locale | java.util.Locale | VARCHAR | 定长字符 |
| timezone | java.util.TimeZone | VARCHAR | 定长字符 |
| currency | java.util.Currency | VARCHAR | 定长字符 |
2、自定义映射类型
Hibernate提供了自定义映射类型接口,允许用户以编程的方式创建自定义的映射类型。用户自定义的映射类型需要实现net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType接口。具体的创建自定义映射类型的方法请参考hibernate官方文档或相关资料,这里不再详细介绍。
Hibernate配置文件中映射元素详解的更多相关文章
- Hibernate配置文件和映射文件详解
Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...
- Hibernate配置文件和映射元素解释
象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素. AD:干货来了,不要等!WOT20 ...
- html5中output元素详解
html5中output元素详解 一.总结 一句话总结: output元素是HTML5新增的元素,用来设置不同数据的输出,没什么大用,了解即可 <form action="L3_01. ...
- html5中section元素详解
html5中section元素详解 一.总结 一句话总结: section元素 用来定义文章中的章节(通常应该有标题和段落内容) section元素的作用就是给内容分段,给页面分区 1.section ...
- html5中time元素详解
html5中time元素详解 一.总结 一句话总结: time的使用的话主要是将时间放在datetime属性里面:<time datetime="2015-10-22"> ...
- nginx配置文件中的location详解
location 语法:location [=|~|~*|^~] /uri/ { … } 默认:否 上下文:server 这个指令随URL不同而接受不同的结构.你可以配置使用常规字符串和正则表达式.如 ...
- Mybatis的配置文件和映射文件详解
一.Mybatis的全局配置文件 1.SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAlias ...
- hibernate多对多映射文件详解(一)
1.仓库表属性 public class WarehouseNew implements java.io.Serializable { // Fields private static final l ...
- Struts2 - 配置文件中result 节点详解
每个 action 方法都将返回一个 String 类型的值, Struts 将根据这个值来决定响应什么结果. 每个 action 声明都必须包含有数量足够多的 result 元素, 每个 resul ...
随机推荐
- jquery1.9学习笔记 之层级选择器(三)
下一个相邻选择器(“prev + next”) 描述:选择所有给出祖先选择器的子孙选择器. 例子: <!doctype html> <html lang='zh'> <h ...
- FileZilla Server下载以及安装使用
新版本filezilla server已经不能在windows xp和windows20003下使用了 下面是可以在xp和2003下使用的最后版本下载地址 http://pan.baidu.com/s ...
- MySQL锁等待分析【2】
MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...
- activiti 5.17 流程图中文乱码问题
1. 流程图中任务中的中文乱码显示问题. 解决方法:设置processEngineConfiguration中的两个字体属性,例如: <bean id="processEngine ...
- NSIS脚本调用C语言写的插件
其实NSIS的官网已经提供了很多别人开发的插件了,今天需要用到GetVersion这个插件,这是不维护的插件了,不推荐用,但是由于现实中的问题,导致我不得不用这个插件. 所以就下载下来了. 下载下来之 ...
- FILTER 哪里没展开改哪里
SELECT * FROM F_PTY_INDIV_TMP O WHERE EXISTS (SELECT 1 FROM F_PTY_INDIV F WHERE O.PTY_ID = F.PTY_ID ...
- Kill 锁,1222:已超过了锁请求超时时段,
应该是你的表体积很大,处理的时候费事,因为几乎所有数据库操作都需要加或多或少的锁,所以会超时.首先你可以使用select * from sys.sysprocesses where blocked&l ...
- 关于bootstrap--表单(下拉<select>、输入框<input>、文本域<textare>复选框<checkbox>和单选按钮<radio>)
html 里面的 role 本质上是增强语义性,当现有的HTML标签不能充分表达语义性的时候,就可以借助role来说明.通常这种情况出现在一些自定义的组件上,这样可增强组件的可访问性.可用性和可交互性 ...
- Ubuntu/Linux 笔记应用 为知笔记(支持markdown)
发现网易云笔记没有Linux,但是为知笔记有Linux版本,且支持markdown格式 sudo add-apt-repository ppa:wiznote-team sudo apt-get up ...
- css中的边框样式
在盒子模型中,盒子的边框是其重要的样式,通过边框我们可以很方便地看出盒子的长宽以及大小.边框的特性可以通过边框线,边框的宽度及颜色来呈现. 1,边框线 边框线指的是边框线条的样式,包括实线,虚线,点划 ...