tigers20010 发表于 2013-1-13 18:35:47

传智播客—hibernate关系映射二(转载)

    7).控制insert和update属性
映射属性
作用
<property>: insert属性
若为false,在insert语句中不包含该字段,该字段永远不能被插入。默认值true。
<property>: update属性
若为false,update语句不包含该字段,该字段永远不能被更新。默认值为true。
<class>:mutable属性
若为false,等价于所有的<property>元素的update属性为false,整个实例不能被更新。默认为true。
<class>:dynamic-insert属性
若为true,等价于所有的<property>元素的dynamic-insert为true,保存一个对象时,动态生成insert语句,语句中仅包含取值不为null的字段。默认false。
<class>:dynamic-update属性
若为true,等价于所有的<property>元素的dynamic-update为true,更新一个对象时,动态生成update语句,语句中仅包含取值被改变的字段。默认false。
 
         8).处理SQL引用表示符
在SQL语法中,表示符是指用于为数据库表、视图、字段或索引等名字的字符串,常规表示符不包括空格,也不包含特殊字符,因此无需使用引用符号。如果数据库表名或列名包含特殊字符,可以使用引用表示符。如:
<property name="name" column="’CUSTOMER NAME’" />
此时的column的指定的字段名,必须使用’与括起来。
 
         9).设置类的包名
         在映射文件中包含了多个类,而这些类又在同一个包中。此时我们可以不在class属性的name属性中指定类的完整名称。首先我们在hibernate-mapping元素中添加一个package属性,之后的所有class子元素的name属性直接指定类名即可。
<hibernate-mapping package="cn.itcast.cc.hibernate">
 
二、映射对象标识符
         在Java应用程序中,JVM使用地址来区分一个类的多个实例。在关系型数据库中使用主键来区分记录。在hibernate中使用OID来建立内存中的对象和关系数据库中对应的记录,其实OID就是持久化对象中的id属性对应数据库中的主键。之所以使用OID是因为hibernate的缓存技术,也需要使用OID进行自动监控。
        
1.关系数据库中的主键
         主键不能为null、唯一且永远不会改变。
         MySQL中的自动增长主键,将字段类型设置为 primary key auto_increment。
         SQLServer中的自动增长主键,将字段类型设置为 primary key identity。
         Oracle中的自动增长主键,需要自定义序列:create sequence seq_customer increment by 1 start with 1。
 
2.JAVA对象的“主键”、Hibernate中用对象表示符(OID)来区分对象
         就是对象的地址,使用==与equal()比较两个对象是否相同。
         Hibernate中使用OID来维护对象与数据记录的对应关系。
 
3.在hibernate中配置OID对应关系与主键生成器
<id name="id" type="long" column="ID">
      <generator class="increment" />
</id>
         持久化对象的id属性与数据表格的ID字段对应,并使用hibernate提供的内置标示符生成器——increment。Hibernate提供了表识符生成器接口:net.sf.hibernate.id.IdentifierGenerator,并提供了多种内置的实现。
 
4.映射对象表示符
表示符生成器
描述
Increment
适用于代理主键。由hibernate自动以递增的方式生成表识符,每次增量为1。
Identity
适用于代理主键。由底层数据库生成表识符,条件是数据库支持自动增长数据类型。
Sequence
适用于代理主键。Hibernate根据底层数据库序列生成标识符,条件是数据库支持序列。
Hilo
适用于代理主键。Hibernate根据hign/low算法生成标识符。Hibernate把特定表的字段作为“hign”值。默认情况下,采用hibernate_unique_key表的next_hi字段。
Native
适用于代理主键。根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo。
Uuid.hex
适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。
assigned
适用于自然主键。由java程序负责生成标识符,不能把setID()方法声明为Private的。尽量避免使用自然主键。
 
5. Hibernate中的increment
<id name="id" type="long" column="ID">
    <generator class="increment"/>
</id>
适用范围:
1.由于不依赖与底层数据库,适合所有的数据库系统。
2.单个进程访问同一个数据库的场合,集群环境下不推荐适用。
3.OID必须为long、int或short类型,如果把OID定义为byte类型,抛异常。
4.在每次插入记录时,hibernate都会先调用“select max(id) from table;”返回最大的数据表中最大的id值,然后+1设置为新记录的id。使用increment会产生多进程访问的安全问题。所以在使用不依赖与底层数据库的主键时要注意这个问题。
 
6. Hibernate中的identity
<id name="id" type="long" column="ID">
    <generator class="identity"/>
</id>
由底层数据库生成标识符,需要把字段定义成自增型。因为由数据库底层生成标识符,所以它是先在数据库中计算id,然后再返回id。这与increment不同,所以要使用identity防止多进程访问的安全。
 
7. Hibernate中的sequence
<id name="id" type="long" column="ID">
     <generator class="sequence">
            <param name="sequence">tester_id_seq</param>
     </generator>
</id>
适用范围:
底层数据库要支持序列,Oracle DB2 SAP等。
OID必须为long、int或short类型。
 
7. Hibernate中的hilo
<id name="id" type="long" column="ID">
     <generator class="hilo">
            <param name="table">hi_value</param>
            <param name="column">next_value</param>
            <param name="max_lo">100</param>
     </generator>
</id>
使用范围:
该机制不依赖于地层数据库,因此适用于所有的数据库系统。
OID必须为long、int、short类型,如果为byte类型的话,会抛出异常。
Net.sf.hibernate.id.IdentifierGeneratorException:this id generator generates Long、integer、short。
 
7. Hibernate中的native
<id name="id" type="native" column="ID">
     <generator class="native" />
</id>
适用范围:
该类型能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库的平台,即在同一个应用中需要连接多种数据库系统的场合。
OID与以上类同。
 
7. Hibernate中的自然主键
1).单个自然主键
<id name="id" column="NAME" type="string">
      <generator class="assigned" />
</id>
<version name="version" column="VERSION" unsaved-value="0" />
自然主键:把具有业务含义的字段作为主键叫做自然主键。
 
2).复合主键
<composite-id>
     <key-property name="name" column="NAME" type="string">
     <key-property name="companyId" column="COMPANY_ID" type="long">
</composite-id>
<version name="version" column="VERSION" unsaved-value="0" />
使用联合主键的持久化类需要实现serializable接口和覆盖equals()、hashCode()方法。
<composite-id name="costomerid" class="mypack.CustomerId">
      <key-property name="name" column="NAME" type="string">
      <key-property name="companyId" column="COMPANY_ID" type="long">
</composite-id>
可以使用customId属性来设置连联合主键。
 
三、映射一对多关联关系
         一对多的关系,还有俺再重复吗?先把老徐的东西拿出来:
http://itjava2000.iteye.com/admin/blogs/2009-12-31%20%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2%E2%80%94hibernate%E5%85%B3%E7%B3%BB%E6%98%A0%E5%B0%84%20-%20%E5%85%85%E6%BB%A1%E7%94%9F%E6%B4%BB%E7%9A%84%E5%91%B3%E9%81%93%EF%BC%81%20-%20BlogJava.files/clip_image005_thumb.gif
(我们的UML课程是由老徐来传授的,上课时他的图解画的很专业)
 
1.多对一单向关联关系
         我们使用订单表(orders)与客户表(customers)。订单对象(Order)中包含一个客户对象(Customer),这是对象的多对一关系(一个客户可能有多个订单)。
         我们需要向Order的映射文件中添加一个many-to-one元素:
<hibernate-mapping>

<span style="font-size: 10pt; color: black;">    </sp
页: [1]
查看完整版本: 传智播客—hibernate关系映射二(转载)