1 映射关系总览
①单类→单表
②单向n对1
③双向1对n
④1对1基于外键
⑤1对1基于主键
⑥单向多对多
⑦双向多对多java
2 单类→单表的映射
①映射主键
②映射日期类型
③映射大对象
④hbm文件中的其余属性
⑤数据类型映射对照表git
3 Hibernate中主键生成方式
3.1 increment
①由Hibernate以递增的方式为代理主键赋值
②Hibernate会先读取数据库表中的主键的最大值,插入记录时以最大值+1做为主键
③不依赖底层数据库系统,因此适合各类类型的数据库
④在多线程模式下运行时,很容易发生错误(多个线程可能获取数据库表中的主键的最大值相同,都以最大值+1做为主键向数据库表中插入记录,致使插入到数据库表中的多条记录的主键相同,从而违反了数据库表中主键的惟一性,故会报错)
⑤OID必须为long、int或short类型,若是为byte则会抛出异常
3.2 hilo
①由Hibernate根据high/low算法生成主键
②hilo标识符生成器在生成标识符时,须要读取并修改HI_TABLE表中的NEXT_VALUE值
③彻底不依赖于任何数据库系统
④OID必须为long、int或short类型,若是为byte则会抛出异常程序员
<generator class= "hilo"> <param name= "table">HL_table </param> <param name= "column">NEXT_VALUE </param> <param name= "max_lo">10</param > </generator>
⑤高低算法github
参见:我写的博客:Hibernate - 高低算法算法
3.3 identity
①由具体数据库负责生成主键
②要求数据库将主键定义为自动增加类型
③支持自增主键的数据库:MySQL、DB二、微软SQLServer、Sybase等;
可是有局限性,由于Oracle不支持;
④OID必须为long、int或short类型,若是为byte则会抛出异常sql
3.4 sequence
①利用底层的数据库提供的序列生成标识符
②要求底层数据库支持序列:DB二、Oracle
③OID必须为long、int或short类型,若是为byte则会抛出异常
④配置方式数据库
<id name ="studentId" type="java.lang.Integer"> <column name ="STUDENTID" /> <generator class ="sequence"> <param name ="sequence">stu_seq</ param> </generator > </id >
3.5 native
①依据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或hilo
②因为native标识符生成器可以根据底层数据库系统的类型,自动选择合适的方式生成主键,因此很是适合跨数据库平台开发
③OID必须为long、int或short类型,若是为byte则会抛出异常session
3.6 assigned(指定的)
Hibernate和数据库都不负责生成主键的值,彻底由程序员本身指定。
3.7 其余主键生成方式
select、seqhilo、foreign、guid等等
4 在Hibernate中映射日期和时间
4.1 Java数据类型和JDBC API的对应关系多线程
注:时间戳:从1970年1月1日0点0时0分0秒开始计时,到当前时间所通过的毫秒数app
4.2 Hibernate中的日期映射方式
大部分状况下Hibernate能够根据Java类型自动找到对应的Hibernate映射类型,从而肯定数据库表中的字段类型,但若是一个Java类型对应的Hibernate映射类型不仅一个,那么就必须为Java类型明确指定Hibernate映射类型,例如:
5 Java中大对象类型的Hibernate映射
5.1 大对象
①长字符串:长度超过255的字符串
②二进制数据:图片、音频、视频等文件
5.2 Java中的大对象类型
①长字符串
[1]java.lang.String[推荐]
[2]java.sql.Clob——Character Large Object,对应SQL标准类型中的CLOB
②二进制数据
[1]java.sql.Blob——Binary Large Object,对应SQL标准类型中的BLOB(推荐)
[2]byte[]
5.3 MySQL不支持标准SQL的CLOB类型
①TEXT
②MEDIUMTEXT
③LONGTEXT
5.4 精确映射SQL类型
①使用Hibernate映射大对象
<property name= "content" type ="text"/>在MySQL中生成的字段类型:longtext <property name= "photo" type ="blob"/>在MySQL中生成的字段类型:longblob
②精确指定SQL类型
<property name= "content" type ="text"> <column name ="my_content" sql-type="mediumtext" /> </property> <property name= "photo" type ="blob"> <column name ="my_photo" sql-type="mediumblob" /> </property>
5.5 使用Hibernate工具类建立大对象
FileInputStream in = new FileInputStream( "chain.jpg"); Blob photo = Hibernate.getLobCreator(session ).createBlob(in, in.available());
5.6 经过大对象获取输入流
InputStream in = photo.getBinaryStream(); OutputStream out = new FileOutputStream( "bingbing.jpg"); byte [] b = new byte[1024]; int len = 0; while((len = in.read(b)) != -1){ out.write(b, 0, len); } in.close(); out.close();
附:MySQL中四种BLOB类型的最大范围
6 Hibernate映射类型对照表
7 对象关系映射文件
7.1 Hibernate使用*.hbm.xml文件定义持久化类和数据库表之间的映射关系,并以这个文件为依据生成各类SQL语句
7.2 映射关系
①持久化类:数据库表
②持久化类属性:数据库表中的字段
7.3 经常使用设置
7.4 元素属性说明
元素 | 属性 | 说明 |
hibernate-mapping | schema | 指定所映射的数据库schema的名称。若指定该属性,则代表会自动添加该 schema前缀 |
catalog | 指定所映射的数据库catalog的名称 | |
default-cascade | 默认值为none。设置hibernate默认的级联风格。若配置Java属性,集合映射时没有指定cascade属性,则Hibernate 将采用此处指定的级联风格 | |
default-access | 默认为property。指定Hibernate的默认的属性访问策略。默认值为property,即便用getter,setter方法来访问属性。若指定access,则Hibernate会忽略getter/setter方法,而经过反射直接访问成员变量。 | |
default-lazy | 默认值为true。设置Hibernat的延迟加载策略。该属性的默认值为true,即启用延迟加载策略。若配置Java属性映射,集合映射时没有指定lazy属性,则Hibernate将依据这一设定使用延迟加载策略 | |
auto-import | 默认值为true。指定是否能够在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。 | |
package | 指定一个包前缀,若是在映射文档中没有指定全限定的类名,就使用这个做为包名。 | |
class | name | 指定该持久化类映射的持久化类的类名 |
table | 指定该持久化类映射的表名,Hibernate默认以持久化类的类名做为表名 | |
dynamic-insert | 若设置为true,表示当保存一个对象时,会动态生成insert语句,insert语句中仅包含全部取值不为null的字段。默认值为false。 | |
dynamic-update | 若设置为true,表示当更新一个对象时,会动态生成update语句,update语句中仅包含全部取值须要更新的字段。默认值为false | |
select-before-update | 设置Hibernate在更新某个持久化对象以前是否须要先执行一次查询。默认值为false | |
batch-size | 指定根据OID来抓取实例时每批抓取的实例数 | |
lazy | 指定是否使用延迟加载 | |
mutable | 若设置为true,等价于全部的<property>元素的update属性为 false,表示整个实例不能被更新。默认为true。 | |
discriminator-value | 指定区分不一样子类的值。当使用<subclass/>元素来定义持久化类的继承关系时须要使用该属性 | |
id | name | 标识持久化类OID的属性名 |
column | 设置标识属性所映射的数据表的列名(主键字段的名字) | |
unsaved-value | 若设定了该属性,Hibernate会经过比较持久化类的OID值和该属性值来区分当前持久化类的对象是否为临时对象 | |
type | 指定Hibernate映射类型。Hibernate映射类型是Java类型与SQL类型的桥梁。若是没有为某个属性显式设定映射类型,Hibernate会运用反射机制先识别出持久化类的特定属性的Java类型,而后自动使用与之对应的默认的Hibernate映射类型。Java的基本数据类型和包装类型对应相同的Hibernate映射类型。基本数据类型没法表达null,因此对于持久化类的OID推荐使用包装类型。 | |
generator | class | 标识符生成器全类名或简单类名 |
property | name | 指定该持久化类的属性的名字 |
column | 指定与类的属性映射的表的字段名。若是没有设置该属性,Hibernate将直接使用类的属性名做为字段名 | |
type | 指定Hibernate映射类型。Hibernate映射类型是Java类型与SQL类型的桥梁。若是没有为某个属性显式设定映射类型,Hibernate会运用反射机制先识别出持久化类的特定属性的Java类型,而后自动使用与之对应的默认的Hibernate映射类型 | |
not-null | 若该属性值为true,代表不容许为null,默认为false——? | |
access | 指定Hibernate的默认的属性访问策略。默认值为property,即便用getter/setter方法来访问属性。若指定field,则Hibernate会忽略getter/setter方法,而经过反射访问成员变量 | |
unique | 设置是否为该属性所映射的数据列添加惟一约束 | |
index | 指定一个字符串的索引名称。当系统须要Hibernate自动建表时,用于为该属性所映射的数据列建立索引,从而加快该数据列的查询。 | |
length | 指定该属性所映射数据列的字段的长度 | |
scale | 指定该属性所映射数据列的小数位数,对double,float,decimal等类型的数据列有效 | |
formula | 设置一个SQL表达式,Hibernate将根据它来计算出派生属性的值 |
8 派生属性
①概念:并非持久化类的全部属性都直接和表的字段匹配。持久化类的有些属性的值必须在运行时经过计算才能得出来,这种属性称为派生属性。
②formula属性
[1]formula=“(sql)”的英文括号不能少
[2]SQL表达式中的列名和表名都应该和数据库对应,而不是和持久化对象的属性对应
[3]若是须要在formula属性中使用参数,可直接使用where cur.id=id 形式,其中id就是参数,和当前持久化对象的id属性对应的列的id值将做为参数传入
GitHub地址:https://github.com/leebingbin/