==============
主键:
如果是数字,建议使用包装类型。
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:对 DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 的内置标识字段提供支持。返回的标识符是 long,short 或者 int 类型的。使用数据库的自动增长策略,不是所有数据库都支持,比如oracle就不支持(oracle中没有自动增长,他是序列) ,数据库的自动增长策略是不同的。
<generator/>
-->
—————————————————————————————————————————
<!-- sequence:在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(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,n是next_value的值
-->
——————————————————————————————————————
<!-- 根据底层数据库的能力选择 identity、sequence 或者 hilo中的一个。
<generator></generator>
-->
—————————————————————————————————————————
<!-- increment:由Hibernate维护的自动增长。
先查询当前最大的id值,再加1使用
不推荐使用,因为在多线程下会问题。
当同时向数据库中添加数据时,一个线程等待(此时从数据库中查询到的max 的id是6,而另外一个线程过来,查询到的Max id也是6 那么此时第二个线程执行结束,生成一个id为7 的一条记录,第一个等待的线程最后执行,生成的记录也是id为7 ,此时就是主键冲突,也就出现了线程安全的问题。
<generator></generator>
-->
—————————————————————————————————————————
<!-- assigned:手工指定主键值,那么在生成实体的时候要手动的指定实体的id
<generator></generator>
-->
—————————————————————————————————————————
<!-- uuid:由Hibernate自动生成UUID并指定为主键值。 -->
<generator></generator>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
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
。