xxx.hbm.xml文件详解(主键配置)

==============

主键:

    如果是数字,建议使用包装类型。

 

identity       :主键自动增长

sequence

hilo           :高地位算法

native     :选择本地支持的主键生成策略

assigned   :手工指定主键

uuid

foreign

...

 

<hibernate-mapping package="cn.itcast.d_hbm_id">

   

    <class name="User" table="t_user">

       

        <!-- id元素用于映射主键。

            子元素generator是用于指定主键生成策略的,即:某种生成主键的某种方式,

可能程序员手动指定,可能数据库中自动生成,等等。

         -->

        <id name="id">

            <!-- identity:对 DB2MySQLMS SQL ServerSybase HypersonicSQL 的内置标识字段提供支持。返回的标识符是 longshort 或者 int 类型的。使用数据库的自动增长策略,不是所有数据库都支持,比如oracle就不支持(oracle中没有自动增长,他是序列) ,数据库的自动增长策略是不同的。

            <generator/>

            -->

—————————————————————————————————————————

            <!-- sequence:在 DB2PostgreSQLOracleSAP DBMcKoi 中使用序列(sequence

                在使用Oracle数据库时可以使用这一个

            <generator/>

            -->

            以上几种是数据库的自动生成的,我们是不用管的。

—————————————————————————————————————————

            <!-- hilo,使用高低位算法生成主键值。是不依赖数据库的一种方式。

              只需要一张额外表,所有的数据都支持。

            <generator>

                <param name="table">hi_value</param>

                <param name="column">next_value</param>

                <param name="max_lo">100</param>

        </generator>

         像上面写了之后,表将自动创建出来,表名:hi_value,表中的列名:next_value

规律是:n*100+n,即生成的主键是:n*100+n,nnext_value的值

-->

       ——————————————————————————————————————  

        <!-- 根据底层数据库的能力选择 identitysequence 或者 hilo中的一个。

        <generator></generator>

         -->

—————————————————————————————————————————

            <!-- increment:由Hibernate维护的自动增长。

                先查询当前最大的id值,再加1使用

                不推荐使用,因为在多线程下会问题。

当同时向数据库中添加数据时,一个线程等待(此时从数据库中查询到的max id6,而另外一个线程过来,查询到的Max id也是6 那么此时第二个线程执行结束,生成一个id7 的一条记录,第一个等待的线程最后执行,生成的记录也是id7 ,此时就是主键冲突,也就出现了线程安全的问题。

        <generator></generator>

            -->

—————————————————————————————————————————           

         <!-- assigned:手工指定主键值,那么在生成实体的时候要手动的指定实体的id

        <generator></generator>

            -->

—————————————————————————————————————————

            <!-- uuid:由Hibernate自动生成UUID并指定为主键值。  -->

        <generator></generator>

 

        </id>

       

        <property name="name"/>

    </class>

   

</hibernate-mapping>

 

. 高/低位算法(Hi/Lo Algorithm)

hilo  seqhilo 生成器给出了两种 hi/lo 算法的实现, 这是一种很令人满意的标识符生成算法。第一种实现需要一个“特殊”的数据库表来保存下一个可用的“hi”值。 第二种实现使用一个 Oracle 风格的序列(在被支持的情况下) 

 

<id name="id" type="long" column="cat_id">       
 <generator class="hilo">              
   <param name="table">hi_value</param>             
    <param name="column">next_value</param>                
    <param name="max_lo">100</param>        
 </generator>
</id>
<id name="id" type="long" column="cat_id">        
    <generator class="seqhilo">                
        <param name="sequence">hi_value</param>                
        <param name="max_lo">100</param>        
    </generator>
</id>

可惜的是,你在为 Hibernate 自行提供 Connection 时无法使用 hilo。 当 Hibernate 使用 JTA 获取应用服务器的数据源连接时,你必须正确地配置 hibernate.transaction.manager_lookup_class

你可能感兴趣的:(xxx.hbm.xml文件详解(主键配置))