zoukankan      html  css  js  c++  java
  • hibernate产生自动增长的主键

    hibernate产生自动增长的主键

    hibernate提供了产生自动增长类型主键的多种策略,这里以uuid.hex为例说明具体用法:

    1、在数据库中建立表,主键名称为ID,类型为varchar2(字符串型)


    2、在**.hbm.xml(hibernate映射文件)中配置如下
     <class name="com.jat.bisarea.ho.Test" table="BA_VVTEST">
      <id name="id" type="string" column="ID">
       //该句指定使用hibernate自带的uuid.hex策略生成主键
       <generator class="uuid.hex"/>//数据类型与策略的具体对应下面有详细叙述
      </id>
      <property name="uname" type="java.lang.String" column="UNAME"/>
     </class>


    3、在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可,相关java代码如下:

    Session s = HibernateUtil.currentSession();
            Transaction tx = s.beginTransaction();

            Test test = new Test();
            String uname = httpServletRequest.getParameter("uname");
            test.setUname(uname);
            //只需对uname进行set,id由hibernate生成
            s.save(test);
            tx.commit();

    4、使用其它策略的方法基本一致,例如hilo、seqhilo等

    Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括:

     

    “assigned”

     

    主键由外部程序负责生成,在 save() 之前指定一个。

     


     

    “hilo”

     

    通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。

     


     

    “seqhilo”

     

    与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。

     


     

    “increment”

     

    主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。

     


     

    “identity”

     

    采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。

     


     

    “sequence”

     

    采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。

     


     

    “native”

     

    由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。

     


     

    “uuid.hex”

     

    由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

     


     

    “uuid.string”

     

    与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。

     


     

    “foreign”

     

    使用另外一个相关联的对象的标识符作为主键。  


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/axu20/archive/2007/06/28/1670405.aspx

      当使用assigned的方式手动设置主键时,需要注意database.hbm.xml 文件中的classs="assigned",同时也要在数据库中去掉主键自动生成,否则会报错:

    org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ***(POJO类,及持久化类名)

    分析及解决:

    你要操作的数据表中的id(即主键)的类型设置成了“自动增长类型”,而在你的

    hibernate.cfg.xml中,id的生成方式是assigned,即
    <id name="id" type="integer">
                <column name="id" />
                <generator class="assigned" />
    </id>
    这种搭配是矛盾的!

    主键的assigned生成方式由程序自动生成表的主键,即在你的测试程序中要调用setId()方法,且必

    须在调用save()前调用(或者说在调用save()前必须指定id,其实就是说,主键值不能为空!)。
    把主键的生成方式改为native,它的特征是能够根据底层数据库自动选择主键生成方式。

  • 相关阅读:
    AtCoder Regular Contest 093
    AtCoder Regular Contest 094
    G. Gangsters in Central City
    HGOI 20190711 题解
    HGOI20190710 题解
    HGOI 20190709 题解
    HGOI 20190708 题解
    HGOI20190707 题解
    HGOI20190706 题解
    HGOI 20190705 题解
  • 原文地址:https://www.cnblogs.com/pricks/p/1498654.html
Copyright © 2011-2022 走看看