总结 hibernate中一对一配置 以及多对一配置说明

来源:互联网 发布:霸道总裁小说知乎 编辑:程序博客网 时间:2024/06/05 09:52

1:Hibernate的Generator属性有7种class,本文简略描述了这7种class的意义和用法。

1、identity:用于MySql数据库。特点:递增

    < idname="id" column="id">  

        < generatorclass="identity"/>  

    < /id>

注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。

2、sequence:用于Oracle数据库

    < idname="id" column="id">  

         < paramname="sequence">序列名< /param>  

       < generatorclass="sequence">  

       </generator>  

    < /id>

3、native:跨数据库时使用,由底层方言产生。

Default.sequence为hibernate_sequence

    < idname="id" column="id">  

       < generatorclass="native"/>  

    < /id>  

注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。

如果Oracle中没有该序列,连Oracle数据库时会报错。

4、hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。

    < idname="id" column="id">  

        < generatorclass="hilo">  

          < paramname="table">high_val< /param>  

           < paramname="column">nextval< /param>  

          < paramname="max_lo">5< /param>  

        </generator>  

    < /id> 

5、sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。

    < idname="id" column="id">  

    < generatorclass="hilo">  

    < paramname="sequence">high_val_seq< /param>  

    < paramname="max_lo">5< /param>  

    < /generator>  

    < /id>

6、assigned:用户自定义id;

    < idname="id" column="id">  

    < generatorclass="assigned"/>  

    < /id>

7、foreign:用于一对一关系共享主健时,两id值一样。

 

< generatorclass="sequence"/>

这是一个非常简单的接口;某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现。下面是Generator子元素的一些内置生成器的快捷名字:

increment(递增)

用于为long,short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使用。

 

identity

对DB2,MySQL,MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。

sequence (序列)

在DB2,PostgreSQL,Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

hilo (高低位)

使用一个高/低位算法来高效的生成long,short或者 int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key 和next_hi)作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要使用这种生成器。

seqhilo(使用序列的高低位)

使用一个高/低位算法来高效的生成long,short或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

uuid.hex

用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。

uuid.string

使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中

native(本地)

根据底层数据库的能力选择identity,sequence 或者hilo中的一个。

assigned(程序设置)

让应用程序在save()之前为对象分配一个标示符。

foreign(外部引用)

使用另外一个相关联的对象的标识符。和< one-to-one>联合一起使用。

 

 

 

 

2:

 

!!! 多 一    的理解

         外键表 一般为:一

 

 

3: hibernate”多对一”理解

         多:

<many-to-onename="grades" class="Grades" fetch=" select "lazy="false">

         1:Lazy:默认是true

                  1:false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象

2:proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类

3:no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类

注意:在class标签上配置的lazy属性不会影响到关联对象

2:Fetch:

1:lect:是以普通sql方式进行查询加载

                   2:join  合并sql,相当于发送一条sql,当选择这种模式时 懒加载是没有效果的

         3:class需要写全局限定名,如果<hibernate-mapping package="com.entity">有包名则可以只写类名

         一:

       <set name="users" fetch="select" lazy="extra" >

           <key> <column name="gradesid" /></key>

           <one-to-many class="User" />

</set>

1:fetch

         1:select:普通查询方式

         2:subselect 子查询方式,另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合

、              3:join合并sql,相当于发送一条sql,当选择这种模式时 懒加载是没有效果的

2:lazy

         1:true  默认值

         2:false  实时加载

3:extra 智能加载  在获取数据量的时候会智能发送一条sql查询数据量,

 

4:hibernate”一对一”理解

         <one-to-onename="" class="" ></one-to-one>

         俩个表或多个表 保持相同主键.   建议主键列名保持一致,可以不同

         会以相同主键值进行数据查询加载

        

         lazy(可选 — 默认为 proxy):默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。lazy="false"指定此关联总是被预先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate会采取预先抓取。

 

constrained默认值为false

 

constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应,另外该选项最关键的是影响save和delete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之。

 

one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。

 

one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读,如2个表user,car;在位false时sql如下:select *from user a left outer join car b on a.id=b.id left outer join on user c ona.id=c.id where a.id=? 删除的时候最好删除从表,删除主表会先查询下主表,在联合查询下。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 0
原创粉丝点击