hibernate 琐碎配置介绍
配置文件类型:
integer,long,short,float,double,character,byte,boolean,yes_no,true_false
这些类型都对应Java的原始类型或者其封装类,来符合(特定厂商的)SQL字段类
型。boolean,yes_no和true_false都是Java中boolean或者java.lang.Boolean的另外
说法。
string
从java.lang.String到VARCHAR(或者Oracle的VARCHAR2)的映射。
date,time,timestamp
从java.util.Date和其子类到SQL类型DATE,TIME和TIMESTAMP(或等价类型)的映射。
calendar,calendar_date
从java.util.Calendar到SQL类型TIMESTAMP和DATE(或等价类型)的映射。
big_decimal,big_integer
从java.math.BigDecimal和java.math.BigInteger到NUMERIC(或者Oracle的NUMBER类型)
的映射。
locale,timezone,currency
从java.util.Locale,java.util.TimeZone和java.util.Currency到VARCHAR(或者Oracle的
VARCHAR2类型)的映射。Locale和Currency的实例被映射为它们的ISO代码。TimeZone的
实例被影射为它的ID。
class
从java.lang.Class到VARCHAR(或者Oracle的VARCHAR2类型)的映射。Class被映射为
它的全限定名。
binary
把字节数组(bytearrays)映射为对应的SQL二进制类型。
text
把长Java字符串映射为SQL的CLOB或者TEXT类型。
serializable
把可序列化的Java类型映射到对应的SQL二进制类型。你也可以为一个并非默认为基本类
型的可序列化Java类或者接口指定Hibernate类型serializable。
自定义值类型
93
clob,blob
JDBC类java.sql.Clob和java.sql.Blob的映射。某些程序可能不适合使用这个类型,因为
blob和clob对象可能在一个事务之外是无法重用的。(而且,驱动程序对这种类型的支持
充
=========================================
一些属性记录:
http://doc.javanb.com/hibernate-reference-3-2-0-zh/ch20.html对hibernate实体xml文件中各种配置参数的介绍
很多Hibernate映射元素定义了可选的length、precision或者scale属性。你可以通过这个属性设置字段的长度、精度、小数点位数。
Oracle使用标准、可变长度的内部格式来存储数字。这个内部格式精度可以高达38位。
NUMBER数据类型可以有两个限定符,如:
columnNUMBER(precision,scale)
precision表示数字中的有效位。如果没有指定precision的话,Oracle将使用38作为精度。
scale表示数字小数点右边的位数,scale默认设置为0. 如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数
5)Set集合石无序、不能有重复元素的,Hibernate提供了一个Bag集合,用来处理重复元素的情况。值得注意的是,Bag并不是JavaAPI,而是Hibernate提供的。Bag集合映射和List不同,List的集合元素是有序的,需要有一个集合序号
来标识集合元素的位置,List元素可以重复;而Bag集合元素不需要元素序号标识,元素也是可以重复的。
在hibernate中cascade="all"和cascade="all-delete-orphan"
all的意思是save-update+delete
all-delete-orphan的意思是当对象图中产生孤儿节点时,在数据库中删除该节点
all比较好理解,举个例子说一下all-delete-orphan:
Category与Item是一对多的关系,也就是说Category类中有个Set类型的变量items.
举个例子,现items中存两个Item,item1,item2,如果定义关系为all-delete-orphan
当items中删除掉一个item(比如用remove()方法删除item1),那么被删除的Item类实例
将变成孤儿节点,当执行category.update(),或session.flush()时
hibernate同步缓存和数据库,会把数据库中item1对应的记录删掉
Hibernatefetch总结
fetch和lazy主要是用来级联查询的,而cascade和inverse主要是用来级联插入和修改的fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指
定joinfetch某个关联对象。fetch策略用于定义get/load一个对象时,如何获取非lazy的对象/集合。这些参数在Query中无效。
hibernate操作数据库插入修改数据库默认值dynamic-insertdynamic-update
2007-12-1716:19
Hibernate允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中<property元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性:
1)<property>元素insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)<property>元素update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)<class>元素mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)<property>元素dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)<property>元素dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)<class>元素dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
7)<class>元素dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false
Hibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.
======================================
主键生成策略
Hibernate中,<id>标签下的可选<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成惟一标示,所有的生成器都实现net.sf.hibernate.id.IdentifierGenerator接口这是一个非常简单的接口,某些应用程序可以选择提供它们自己的特定实现当然,Hibernate提供了很多内置的实现下面是一些内置主键生成器(KeyGenerator)的意义
1)assigned
主键由外部程序负责生成,无需Hibernate参与。让应用程序在save()之前为对象分配一个标示符。这是<generator>元素没有指定时的默认生成策略。
2)hilo
通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。使用一个高/低位算法高效的生成long,short或者int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key和next_hi)作为高位值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
3)seqhilo
与hilo类似,通过hi/lo算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。使用一个高/低位算法来高效的生成long,short或者int类型的标识符,给定一个数据库序列(sequence)的名字。
4)increment
主键按数值顺序递增此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常因此,如果同一数据库有多个实例访问,此方式必须避免使用。
用于为long,short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使用。
5)identity
采用数据库提供的主键生成机制如DB2SQLServerMySQL中的主键生成机制。对DB2,MySQL,MSSQLServer,Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long,short或者int类型的。
6)sequence
采用数据库提供的sequence机制生成主键如Oralce中的Sequence。在DB2,PostgreSQL,Oracle,SAPDB,McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long,short或者int类型的。
7)native
由Hibernate根据底层数据库自行判断采用identityhilosequence其中一种作为主键生成方式
8)uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。由Hibernate基于128位唯一值产生算法生成16进制数值(编码后以长度32的字符串表示)作为主键例如:5abefd3890cat33llsica3ee43bk222
9)uuid.string
与uuid.hex类似,只是生成的主键未进行编码(长度16)在某些数据库中可能出现问题(如PostgreSQL)
10)guid
在MSSQLServer和MySQL中使用数据库生成的GUID字符串。
11)select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
12)foreign
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性另外由于常用的数据库,如OracleDB2SQLServerMySql等,都提供了易用的主键生成机制(Auto-Increase字段或者Sequence)我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响因此,对于并发Insert要求较高的系统,推荐采用uuid.hex作为主键生成机制