Hibernate_3

这几天心情不好,效率不高,当然这两者是互相影响的,导致学习效果直线下降,而且最近还暴饮暴食,本来就不瘦!我的体重啊!今天起,决定要恢复活力!

命名策略的例子
public class MyNamingStrategy extends ImprovedNamingStrategy{
public String classToTableName(String className){
return StingHelper.unqualify(className).toUpperCase()+'S';
}
public String propertyToColumnName(String propertyName){
return propertyName.toUpperCase();
}
public String tableName(String tableName){
return tableName;
}
public String columnName(String columnName){
return columnName;
}
public String propertyToTabTableName(String className, String propertyName){
return classToTableName(classNmae)+'_'+propertyToColumnName(propertyName);
}
}

设置类的包名
<hibernate-mapping package="xxx">
<class name="" >
...
</class>
</hibernate-mapping>

把主键定义为自动增长标识符类型:
auto-increment:自动递增(MySQL)
identity(a,b):以a为起始,自动增加b个长度。(MySQL)
Sequence:创建一个单独的序列。(Oracle)
create sequence XX_ID_SEQ increment by 1 start with 1
curval:返回序列的当前值
nxtval:先增加序列值,然后返回增加后的序列值

Hibernate允许在持久化类中把OID定义为以下整数类型:
short:2个字节 取值范围 -2^15~2^15-1
int:4个字节 取值范围 -2^31~2^31-1
long:8个字节 取值范围 -2^63~2^63-1
为了持久化对象的OID的唯一性和不变形,通常由Hibernate或底层数据库来给OID赋值。把持久化类的OID的setId()方法设为private类型,把GetId()方法设为public类型。
<id name="id" column="ID">\
<generator class="increment" />
</id>
<generator>子元素用来设定标识符生成器。Hibernate提供了标识符生成器接口:org.hibernate.id.IdentifierGenerator接口,并且提供了多种内置的实现。

Hibernate提供的内置标识符生成器
increment:适用于代理主键,由hibernate自动以递增的方式生成标识符,每次增量为1。
identity:适用于代理主键,有底层数据库生成标识符,前提条件是底层数据库支持自动增长字段类型。
sequence:适用于代理主键,Hibernate据底层数据库的序列来生成标识符,前提条件是底层数据库支持序列。
hilo:适用于代理主键,Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为high值。在默认情况下选用hibernate_unique_key表的next_hi字段。
native:适用于代理主键,根据底层数据库对自动生成标识符的支持能力,来选择identity、sequence和hilo。
uuid.hex:适用于代理主键,Hibernate采用128位的UUID算法来生成标识符。
assigned:适用于自然主键,由java应用程序负责生成标识符。
select:适用于遗留数据库中的代理主键或自然主键(具有业务含义的主键)。有数据库中的触发器来生成标识符。
foreign:用另一个关联的对象的标识符来作为当前对象的标识符,主要适用于一对一关联的场合。
increment仅仅在只有单个Hibernate应用进程访问数据库的情况下才能有效。increment的适用范围:由于increment生成标识符的机制不依赖于底层数据库系统,适用于所有的数据库系统;适用于只有单个Hibernate应用进车个访问同一个数据库的场合,在集群环境下不推荐使用;OID必须为long、int或short类型,若把OID定义为byte,在运行时会抛出异常。
identity适用的范围:由于identity生成标识符的机制依赖于底层数据库系统,因此要求底层数据库必须支持自动增长字段类型;OID必须为long、int和short类型。
sequence:MySQL不支持sequence。适用范围:由于sequence生成标识符的机制依赖于底层数据库系统的序列,因此要求底层数据库必须支持序列;OID必须为long、int和short类型。
<generator class="sequence">
<param name="sequence">xx_xx_seq</param>
</generator>

hilo:适用范围:hilo标识符在生成标识符时,需要读取并修改hi_value表中next_value中的值。这段操作需要在单独的事务中处理。适用于所有的数据库;OID必须为long、int和short类型;只能在一个数据库中保证唯一。
<generator class="hilo">
<param name="table">hi_value</param>
<parma name="column">next_value</param>
<param name="max_lo">100</param>
</generator>

native:根据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或hilo标识符生成器。适用范围:适合跨数据库平台开发;OID必须为long、int和short类型。

映射复合自然主键:要求必须实现java.io.Serializable接口。一种方法如下:
<composite-id>
<key-property name="name" column="" type="" />
<key-property name="name" column="" type="" />
</composite-id>
另一种方法单独设置一个类作为主键,这个主键里面还有两个其他表的主键。

多对一的映射关系
<many-to-one
name="" column="" class="" not-null="true" lazy="false" cascade="save-update"
/>
name:设定待映射的持久化类的属性名字
column:设定和持久化类的属性对应的表的外键
class:设定待映射的持久化类的属性和类型
not-null:若为true,则不允许为空,默认为false
lazy:若为proxy,表示对关联的对象使用延迟检索策略并且使用代理,默认为proxy。若为true,则当Hibernate从数据库中加载对象时,会加载与它关联的对象。
cascade:级联保存和更新。当它为save-update时,会级联保存或更新与它关联的表。默认是none。

一对多、多对一映射关系
<set name="" cascade="save-update" inverse="true">
<key column="" />
<one-to-many class="" />
</set>
name:设定待映射的持久化类的属性名
cascade:级联保存和更新

在映射一对多的双向关联关系时,应该在"one"方把<set>元素的inverse属性设为true;在建立两个对象的双相关联时,应该同时修改关联两端的对象的相应属性。

级联删除
<set name="" cascade="delete" inverse="delete">
<key column="" />
<one-to-many class="" />
</set>

父子关系:由父方来控制子方的持久化生命周期,子方对象必须和一个父方对象关联,不允许单独存在。
<set name="" cascade="delete" inverse="all-delete-orphan">
<key column="" />
<one-to-many class="" />
</set>

清理缓存:Session具有一个缓存,位于缓存中的对象称为持久化对象,他和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中对象的变化来执行相关SQL语句,来同步更新数据库,这一过程成为清理缓存(flush)。
Hibernate把对象分为4种状态:持久化状态、临时状态、游离状态和删除状态。

java对象在JVM中的生命周期:当应用程序通过new语句创建一个java对象时,JVM会为这个对象分配一块内存地址,只要这个对象被引用变量引用,它就一直存在内存中。如果这个对象不被任何引用变量引用,它就结束生命周期,JVM的垃圾回收器会在适当的时候回收它的内存。

Session缓存的三大作用:减少访问数据库的频率;当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常;保证数据库中的相关记录与缓存中的相应对象保持同步。Session在清理和缓存时,会自动行进脏检查,若发现Session缓存中的对象与数据库中相应记录不一致,会根据对象的最新属性去同步更新数据库。Session不会立即清理缓存及执行相关的SQL语句,而是在特定的时间点才清理缓存,把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的数据访问性能。

Session在清理缓存时,按照一下顺序执行SQL语句:按照应用程序调用session.save()方法的先后顺序,执行所有对实体进行插入的insert语句。
执行所有对实体进行更新的update语句。
执行所有对集合进行删除的delete语句。
执行所有对集合元素进行删除、更新或插入的SQL语句。
执行所有对集合进行插入的insert语句。
按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句。
在默认情况下,Session会在一下时间点清理缓存:
当应用程序调用org.hibernate.Transaction的commit()方法时,commit()方法先清理缓存,然后再向数据库提交事务。
当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会先清理缓存,使得session缓存与数据库已进行了同步,从而保证查询结果返回的是正确的数据。
当应用程序显式调用session的flush()方法的时候。
若不希望Session在默认的时间点清理缓存,也可通过session的setFlushMode()方法显式设定清理缓存的时间点。FlushMode类定义了3种不同的清理模式:FlushMode.AUTO(默认值)、FlushMode.COMMIT(在查询方法时不进行清理缓存)、FlushMode.NEVER(只在flush()方法中清理缓存)。

一个java对象在它的生命周期中,可处于以下4种状态之一:
临时状态(transient):刚用new语句创建,还没被持久化,并且不处于Session的缓存中。
持久化状态(persistent):已被持久化,并且加入到session的缓存中。
删除状态(removed):不再处于session的缓存中,并且session已计划将其从数据库中删除。
游离状态(detached):已经被持久化,但不再处于session的缓存中。

临时对象的特征:
在使用代理主键的情况下,OID为null
不处于session的缓存中
在数据库中没有对应的记录

持久化对象的特征:
OID不为null
位于一个session实例的缓存中
持久化对象和数据库中的相关记录
session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库

被删除对象的特征:
OID不为null
从一个sessio实例的缓存中删除
session已经计划将其从数据库中删除
session在清理缓存时,会执行SQLdelete语句
一般情况下,应用程序不应该在使用被删除对象

游离对象的特征:
OID不为null
不再位于session的缓存中
游离对象是由持久化对象转变过来的,可能在数据库中还存在它对应的记录

session的一下方法可以把持久化对象转变为游离对象
调用session的close()方法;session的evict()方法能够从缓存中清除一个持久化对象;session的clear()方法能够清除缓存中的所有持久化对象

persist()方法和save()方法的区别在于:persist()方法是在Hibernate3版本中才出现的,实现了EJB3规范中定义的持久化语义。若在事务外调用persist()方法,不会计划执行SQL insert语句;而调用save()方法,都会计划执行SQL insert语句。

load()方法和get()方法的区别在于:当数据库中不存在与OID对象的记录时,load()方法抛出org.hibernate.ObjectNotFoundException异常,而get()方法返回null;两者采用不同的检索策略。load()方法采用延迟检索策略加载持久化对象,除非指定lazy="false",get()无论lazy属性取什么值,都会采用立即检索策略。
若加载一个对象的目的是为了访问它的属性,可以用get()方法
若加载一个对象的目的是为了删除它或为了建立与别的对象的关联关系,可以用load()方法。


session的replicate(a,b)方法能够把一个数据库中的对象复制到另一个数据库中。replicate()的第二个参数决定复制的模式,它有以下可选值:
ReplicationMode.IGNORE:若在目标数据库中已存在OID相同的对象,则无响应。
ReplicationMode.OVERWRITE:若在目标数据库中已存在OID相同的对象,则把参数a对象的数据覆盖已存在的对象。
ReplicationMode.EXCEPTION:若在目标数据库中已存在OID相同的对象,则抛出异常。
ReplicationMode.LATEST_VERSION:若在目标数据库中已存在OID相同的对象,就比较已存在的对象和参数,对已存在的对象进行更新。

cascade的可选值:
none:默认值,忽略其他关联的对象
save-update:当通过session的save()、update()、saveOrUpdate()方法来保存或更新到当前对象之前,级联保存所有关联的临时对象,并且级联更新所有关联的游离对象。
persist:当通过session的presist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象。
merge:当通过session的merge()方法来融合当前对象时,会级联融合所有关联的游离对象。
delete:当通过session的delete()方法来删除当前对象时,会级联删除所有关联的对象。
lock:当通过session的lock()方法把当前游离对象加入到session缓存中时,会把所有关联的游离对象也加入到session缓存中
replicate:当通过session的replicate()方法来复制当前对象时,会级联复制所有关联的对象。
evict:当通过session的evict()方法从session缓存中清除当前对象时,会级联清除所有关联的对象。
refresh:当通过session的refresh()方法刷新当前对象时,会级联刷新所有关联的对象。刷新是指读取数据库中相应数据,然后根据数据库中的最新数据去同步更新session缓存中的相应对象。
all:包含save-update、persist、merge、delete、lock、replicate、evict及refresh的行为。
delete-orphan:删除所有和当前对象解除级联关系的对象。
all-delete-orphan:包含all和delete-orphan的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值