映射Hibernate对象标识符

原创 2007年09月15日 00:26:00
   映射Hibernate对象标识符:
   Hibernate 中的持久化对象对应数据库中的一张数据表,因此区分不同的持久化对象就不能像以往的JAVA方法通过Object对象的默认equals()方法进行,在Hibernate中是通过OID来完成的,OID对应数据库中的主键。
 接下来我将讲解Hibernate中的主要对象标识生成方法,在Hibernate中共有8种标识符生成方式,其中包括7种标识符生成器和一种复合主键生成方式。
(1)   increment 标识符生成器:
配置方式:
 <hibernate-mapping>
   <class name=”IncrementTester” table=”INCREMENT_TESTER”>
<id name=”id” type=”long” column=”ID”>
 <generator class=”increment”/>
</id>
          </class>
        </hibernate-mapping>
使用这种方式生成OIDHibernate 汇在持久化一个对象时以递增的方式产生OID,此方式不依赖于底层数据库,并且只适用于但进程环境下,在多线程环境下很可能生成相同主键值,而且OID必须为long,int,short类型。
(2)   identify标识符生成器:
配置方式:
 <hibernate-mapping>
   <class name=”IdentifyTester” table=”IIDENTIFY_TESTER”>
<id name=”id” type=”long” column=”ID”>
 <generator class=”identify”/>
</id>
          </class>
 </hibernate-mapping>
identify生成标识符的机制依赖底层数据库的支持,因此,要求底层数据库系统必须支持自动增长字段类型, 而且OID必须为long,int,short类型。
(3)   sequence标识符生成器:
配置方式:
<hibernate-mapping>
 。。。。
<id name=”id” type=”long” column=”ID”>
 <generator class=”sequence”>
   <param name=”sequence”>tester_id_seq</param>
 </generator>
</id>
          。。。。
 </hibernate-mapping>
sequence生成标识符的机制依赖于底层数据库系统的序列,因此,需要数据库支持序列机制(如:oracle等),而且OID必须为long,int,short类型。
(4)hilo标识符生成器:
 配置方法:
   <hibernate-mapping>
      。。。。
<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>
             。。。。
 </hibernate-mapping>
hilo标识符生成器由Hibernate按照一种high/low算法生成标识符,他从数据库中的特定表的字段中获取high值,因此需要额外的数据库表保存主键生成的历史状态,hilo生成方法不依赖于底层数据库,因此适用于每一种数据库,但是OID必须为long,int,short类型。
(5)   native标识符生成器:
配置方法:
 <hibernate-mapping>
      。。。。
<id name=”id” type=”long” column=”ID”>
 <generator class=”native”/>
</id>
             。。。。
 </hibernate-mapping>
native生成器能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此非常适用于跨数据库平台开发,他会由Hibernate根据数据库适配器中的定义,自动采用identify,hilo,sequence的其中一种作为主键生成方式,但是OID必须为long,int,short类型。
(6)   uuid.sex标识符生成器:
     配置方法:
 <hibernate-mapping>
      。。。。
<id name=”id” type=”long” column=”ID”>
 <generator class=”uuid.sex”/>
</id>
             。。。。
 </hibernate-mapping>
 Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启动时间,内部自增量等4 个参数生成16进制数值作为主键,一般而言,利用uuid.sex方式生成的主键提供最好的数据插入性能和数据库平台适应性。
(7)   assign标识符生成器:
    <hibernate-mapping>
      。。。。
<id name=”id” type=”long” column=”ID”>
 <generator class=”assign”/>
</id>
             。。。。
 </hibernate-mapping>
采用assign生成策略表示由应用程序逻辑来负责生成主键标识符。
(8)   映射复合主键
   第一种方式由是实体类中的属性组成,实体类本身即同时扮演复合主键类的角色。
 配置方式:
<hibernate-mapping>
   <class name=”Customer” table=”CUSTOMER”>
<composite-id>
 <key-property name=”name” column=”NAME” type=”string”/>
<key-property name=”compayid” column=”COMPANYID” type=”string”/>
</composite-id>
          </class>
 </hibernate-mapping>
此时若想使用session.load()方法加载该实体,要求该实体必须实现java.io.Serializable接口,并且要提供equals()方法和hashCode()方法的实现。
例:
  public class Customer implements Serilizable{
   private final String name;
   private final String companyId;
   …….
   public boolean equals(Object o){
if(this==o)return false;
if(!(o instanceof Customer)) return false;
Customer other=( Customer)o;
if(!name.equals(other.getName())) return false;
if(!companyId.equals(other.get CompanyId ())) return false;
return true;
 
}
public int hashCode(){
 int result=(name==null)?0:name.hasCode();
 result=29*result+(companyId==null?0:companyId.hasCode());
 return result;
}
}
 
Customer c=new Customer();
c.setName(“zx”);
c.setCompanyId(“Neusoft”);
session.load(Customer.class,c);
 
第二种方式:以独立主键类映射复合主键,这样可以达到将逐渐逻辑加以隔离的目的。
 配置方式:
 
   <hibernate-mapping>
   <class name=”Customer” table=”CUSTOMER”>
<composite-id name=”customerId” class=”mypack.CustomerId”>
 <key-property name=”name” column=”NAME” type=”string”/>
<key-property name=”compayid” column=”COMPANYID” type=”string”/>
</composite-id>
          </class>
 </hibernate-mapping>
 主键类:
   public class CustomerId{
private String name;
private String customerId;
…….
   }
 实体类:
   public class Customer{
private CustomerId cid;
private String address;
……..
}
 CustomerId customerid=new CustomerId();
 Customerid.setName(“zx”);
Customerid.setSustomerId(“Neusoft”);
Customer c=( Customer)session.load(Customer.class,customerid); 

《精通Hibernate》学习(4)——映射对象标识符

Java语言按内存地址来识别和区分同一个类的不同对象,而关系数据库按主键值来识别和区分同一个表中的不同记录。Hibernate使用对象标识符(OID)来建立内存中的对象和数据库中记录的对应关系,对象的...

hibernate映射对象标识符

(一)、标示符的概念 Java按内存地址区分同一个类的不同对象,关系数据库用主键区分同一个表的不同记录,Hibernate使用OID(对象标识符)来建立内存中的对象和数据库中记录的对应关系。...
  • z_Dendy
  • z_Dendy
  • 2013年05月14日 22:29
  • 810

Hibernate映射类型与映射对象标识符

Hibernate映射主要是通过对象关系映射文件实现,对象关系映射文件把数据库中的实体(一般为二维表)映射到面向对象中的实体对象,把数据库中多个表之间的相互关系也反映到映射好的类中。以后,在Hiber...

hibernate映射文件XXX.hbm.xml配置映射元素详解--对象标识符(OID)

对象标识符号    在关系数据库表中,主键(Primary Key)用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两个变量引用的对象值...

Hibernate 之 标识符生成器/映射类型

下午用hibernate去改善一个项目,结果出现了好多关于映射类型的问题,在网上搜的好多答案也不尽人意,后来结合着hibernate文档以及孙卫琴老师的《hibernate逍遥记》终于解决了 hib...
  • ljfbest
  • ljfbest
  • 2012年04月12日 11:54
  • 918

映射对象标识符(OID,对应数据库主键)

一、OID,唯一性的标志: Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值。...

4.映射对象标识符

1.唯一性的标志 *   Java按地址区分同一个类的不同对象 *   关系数据库用主键区分同一条记录 *   Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。对象的OI...

Hibernate内置对象标识符(OID)生成器

1.increment标识符生成器: private

Hibernate_对象标识符生成策略

所有抱怨社会不公和制度的人,翻译过来往往只有一句话:请给我金钱,女人和社会地位。对象标识符是个什么玩意? 对象标识符(OID)来创建对象和数据库表里记录的对应关系。通俗点说:全世界有那么多叫张三的人...

二:hibernate的持久化类和对象标识符

二 hibernate的持久化类和对象标识符 1.1持久化类的编写规范 1.1.1什么是持久化类: Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:映射Hibernate对象标识符
举报原因:
原因补充:

(最多只允许输入30个字)