标识符属性生成策略与对象识别

 

标识符属性生成策略与对象识别

标识符属性

标识符属性的生成策略

Increment生成策略

Identity生成策略

Sequence生成策略

Hilo生成策略

Seqhilo生成策略

Uuid生成策略

Guid生成策略

Native生成策略

Assigned生成策略

Foreign生成策略`         

 

id值(自动生成序列)

 

 

本章要点

  如何映射复合主键

      使用属性映射复合主键

      使用主键类映射复合主键

Hibernate中的持久化对象的识别

Commons lang builder的使用

 

标识符属性,也可以称为Hibernate主键

标识符属性赋予每个持久化对象独一无二的数值以此区分不同的持久化对象

 

标识符属性的生成策略

Hibernate的映射文件(*hbm.xml)中,<id>元素定义了持久化类的标识符性的名称、类型和与数据库表中字段的映射

<id>元素的<generator>子元素则来设置当前持久化类的标识符属性的策略

Hibetnate中,内置了多种标识符属性生成策略

org.hibernate.id.IdentifierGenerator接口中。

 

 

Increment生成策略:

从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值:

 <id name=”id” type=”java.lang.Integer” column=”ID”>

 <generator class=”increment”>   <-------sequence

      </generator>

</id>

increment(所有数据库)

identify生成策略

MS SQL Server MySQLDB2等数据库中,都可以设置表中某一个字段的数据值自动增长,而identity生成策略就是通过使用这种方式,为当前的记录获取主键值的同时为持久化对象赋予标识符属性值。

<id  name=”id” type=”java.lang.Integer” column=”ID”>

  <generator class=”identity”>

   </generator>

</id>

 

sequence生成策略:

 Oracle DB2PostgreSQL等数据库中创建一个序列(sequence,然后Hibernate通过序列为当前的记录获取主键值,进而为持久化对象赋予标识符属性值

 

<id  name=”id” type=”java.lang.Integer” column=”ID”>

  <generator class=”sequence”>

    <param name=”sequence”>gb_seq</param>

   </generator>

</id>

 

 

hilo生成策略

hilo生成策略采用一种称为高/低位(hi/lo)的高效算法,产生的标识符属性值为longshortint以及他们封装的类型

 

<id  name=”id” type=”java.lang.Integer” column=”ID”>

  <generator class=”hilo”>

<param name=”table”>hibernate_key</param>

<param name=”column”>next_hivalue</param>

   </generator>

</id>

 

 

seqhilo生成策略

seqhilo生成策略使用的还是高低位算法,产生的标识符属性值为longshor/int以及他们封装的类型.hilo生成策略不同和是,它使用指定的sequence获取高低位值。

 

<id  name=”id” type=”java.lang.Integer” column=”ID”>

  <generator class=”seqhilo”>

<param name=”sequence”>hibernate_seq</param>

   </generator>

</id>

 

uuid生成策略:

uudi生成策略采用128uuid算法来生成一个字符类型的主键值,这个算法使用IP地址、JVM启动时间(精确到1/4),系统时间和和一个计数器值(在当前 jvm中唯一)经过计算来产生标识符属性值,可以用于分布式的Hibernate应用中。

<id name=”id” type=”java.lang.String” column=”ID”>

         <generator class=”uuid”>

         </generator>

<id>

 

guid生成策略

这种标识符属性生成策略,借助MS SQL Server 或者MySQL数据库中的GUID字符产生标识符属性值。

 <id name=”id ” type=”java.lang.String” column=”id”>

            <generator clas=”guid”>

             </generator>

</id>

 

native生成策略

Hibernate自己根据所使用的数据库热支持能力,从identitysequence或者hilo生成第一成策略中选择一种标识符属性生成方式

<id name=”id ” type=”java.lang.Integer” column=”ID”>

          <generator class=”native”>

           </generator>

<id>

 

assigned生成策略

使用assigned生成策略表示由Hibernate应用自主指定标识符

属性的数值,也就是说,在调用Session对象的save()方法持久化对象时,需要先对持久化对象的标识符属性赋值。

 

<id name=”id ” type=”java.lang.Integer” column=”ID”>

         <generator class=”assigned”>

         </generator>

<id>

 

foreign生成策略

foreign 生成策略通过所关联的持久化对象,为当前持久化对象设置标识符属性值。

<id name=”id” type=”java.lang.Integer” column=”ID” >

          <generator class=”foreign”>

           <param name=”property”>user</param>

           </generator>

</id>

 

使用主键类映射复合主键

使用这种方式映射复合主键,持久化类需要使用一个单独的主键类对象复合主键进行映射,主键类中的属性就是与映射复合主键字段的属性。

 

使用属性映射复合主键

除了一述这些标识符生成策略之外,我们还可以根据当前的需求。让持久化类的标识符属性映射数据库表的复合主键。(javabene中创建一个构造方法 有复合中所有的属性(列名))等配置。

 

Oralce中不能有表名为user的表,因为在Oralceuser是一个关键字

 

public class HibernateTest{

   public static void main(String [] args){

        SessionFactory sf = HibernateSessionFactory.getSessionFactory();

        Session session = sf.getCurrentSession();

 

SimpleDateFormat sdf = new SimpleDateFormat(“dd-mm-yyyy”);

           

         Date birthdayte=null;

         try{

            birthdayte = sdf.parse(“04-12-1584”);

                    

}catch(ParsetException e ){

  e.printStackTrace();

 

}

 

 

         User user = new User(“flf” , new Date());

         user.setEmail(“flfna@163.com”);

         user.serPassword(55555);

        

         session.beginTranscation();

          session.save(user);

          session.getTransaction().commit();

 

}

}

 

 

 

public class HibernateTest{

  public static void main(String[] args){

SimpleDateFormat sdf = new SimpleDateFormat(“dd-mm-yyyy”);

 

     new HibetnateTest().add();

}

public void add() throws ParseException{

       SimpleDateFormat sdf = new SimpleDateFormat(yyyy-mm-dd);

       Date birthDate = sdf.parse(“1456-11-05”);

   UserId uid = new UserId (birthDate,”flf”);

     

       User u = new User();

       u.setId(uid);

       u.setEmail(“flfna@163.com”);

       u.setPassword(“fweo”);

      

       Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();

       session.beginTransaction();

session.save();

session.getTransaction().commit();

}

}

 

Commons lang builder的使用

总是有重写从Object类所继承的equals()hashCode()toString()等方法的需求

Apache Commons Lang组件builder包中的帮助类可以助我们一臂之力。

 

下载:net.sf.commonclipse.jar  并放到MyEclipse plugin

Commons lang builder 的使用

common-lang-2.4.jar(apache 中的)

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值