`
forever1121
  • 浏览: 16670 次
  • 性别: Icon_minigender_2
  • 来自: 齐齐哈尔
社区版块
存档分类
最新评论
阅读更多
这几天心情不好,效率不高,当然这两者是互相影响的,导致学习效果直线下降,而且最近还暴饮暴食,本来就不瘦!我的体重啊!今天起,决定要恢复活力!

命名策略的例子
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的行为。


分享到:
评论

相关推荐

    Hibernate_3教程chm格式

    Hibernate_3教程chm格式 Hibernate_3教程chm格式

    Hibernate_3[1].2.0_Reference_zh_CN.

    3. **对象关系映射(ORM)**:深入解析Hibernate的ORM机制,包括实体类的设计、属性注解、持久化类的映射文件(hibernate-mapping.xml)和元数据的概念。 4. **Session和Transaction**:阐述Session接口的功能,如...

    hibernate_day02笔记

    3. Hibernate提供了事务管理的代码规范,通常使用try-catch-finally结构,确保事务的正常提交或回滚。 **事务代码规范**: 在try块中开启事务,try块内执行业务逻辑,catch块处理异常并回滚事务,finally块关闭事务...

    hibernate_day03笔记

    hibernate_day03笔记

    hibernate_3配置文件参数汇总

    本篇文章将汇总Hibernate 3配置文件中的关键参数,帮助开发者更好地理解和配置Hibernate。 1. **SQL方言(Dialect)**:`hibernate.dialect` 是一个必不可少的配置项,它定义了Hibernate针对特定关系数据库使用的SQL...

    hibernate_cache_level_1

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在大型应用中,为了提高性能,有效地管理数据访问,Hibernate引入了缓存机制。本篇文章将深入探讨...

    Hibernate_Tools_for_Eclipse插件的安装和使用

    3. 在 Hibernate Configuration 视图窗口中,选择要生成的实体类,点击右键,选择 Hibernate Code Generation,选择生成实体类的选项。 4. 等待生成完毕,实体类已经生成完成。 Hibernate_Tools_for_Eclipse 插件是...

    hibernate_day04笔记

    hibernate_day04笔记

    DMS.rar_dms_hibernate_myeclipse hibernate_mysql hibernate_struts

    3. **MySQL**:MySQL是一个流行的开源关系型数据库管理系统。它被广泛应用于Web应用,因为它速度快、可扩展性好且易于管理。在这个用户登录系统中,MySQL存储了用户的注册信息,如用户名、密码等,供Hibernate查询和...

    Hibernate_QBC和Hibernate_QBE

    标题"Hibernate_QBC和Hibernate_QBE"提及了两个关于Hibernate的查询方式,即Query By Criteria(QBC)和Query By Example(QBE)。Hibernate是Java领域中一个广泛使用的对象关系映射(ORM)框架,它允许开发者以面向...

    hibernate_day4_hibernate_sick7s3_

    【标题】"hibernate_day4_hibernate_sick7s3_" 暗示这是一个关于Hibernate框架的学习资源,可能是第四天的学习内容,专注于"hibernate_sick7s3"这个特定主题。在这个主题下,可能涉及了更深入或者特别的使用场景或...

    java_hibernate_day01.pdf

    java_hibernate_day01.pdf

    java_hibernate_day02.pdf

    java_hibernate_day02.pdf

    Hibernate_3.2.0_Reference_zh_CN.rar hibernate中文api

    3. **实体类(Entity)**:在Hibernate中,Java类对应数据库中的表,类的属性对应表的列。使用`@Entity`注解标识为实体类,并用`@Table`定义对应的数据库表名。 4. **主键(Primary Key)**:`@Id`注解用于标识类中...

    hibernate_second2项目源码

    3. **级联操作的顺序**:级联操作是有顺序的,Hibernate会按照定义的顺序处理这些操作。在进行级联保存时,先保存或更新父对象,然后是子对象,确保关联关系的正确建立。 4. **性能考虑**:虽然级联操作方便,但...

    struts_hibernate_bbs.rar_bbs_hibernate b_hibernate bbs_struts hi

    Struts和Hibernate是Java开发中两个非常重要的框架,它们在构建Web应用程序,特别是大型的、数据驱动的BBS(Bulletin Board System,论坛)系统时,起到了核心作用。本压缩包"struts_hibernate_bbs.rar"包含了一个...

    Hibernate_3.2.0_Reference_zh_CN

    3. **对象持久化**:详细讲解了实体类的定义,包括注解和XML映射文件的使用,以及实体的生命周期管理,如持久化、加载、更新和删除操作。 4. **查询语言(HQL)**:Hibernate特有的查询语言,类似于SQL,但面向对象...

    test_hibernate_oracle_03.zip_Insert _hibernate_oracle_query_upda

    3. **Oracle**:是一个强大的关系型数据库管理系统,广泛应用于企业级应用中。Hibernate支持多种数据库,包括Oracle,使得开发者可以在不同数据库间切换而无需更改大量代码。 4. **Query**:在Hibernate中,可以通过...

    MyEclipse_Hibernate_Quickstart

    3. **定制Hibernate配置文件**:修改`hibernate.cfg.xml`文件,以适应特定的项目需求,如指定数据库连接信息。 4. **创建Hibernate Java表映射**:使用Database Explorer工具从现有的数据库表生成对应的Java类和.hbm...

Global site tag (gtag.js) - Google Analytics