- n, I( Z# I. _/ Z由hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。 & z9 V$ Z% y! G+ K% m$ W0 C7 Y! k p g# w. m/ [2 \) G0 f
首先我的表(Info)由两个字段组成,即:/ }4 J5 U4 u2 q, Z: @
% r0 f! n1 a& j$ h: w! Qint id;//主建& l% @, e- v* o. _8 v
7 ]% ?) v w- N( t5 _+ K* bString name;6 O4 s! m, J9 ]& a! t+ z
8 Y/ P6 g$ d {3 ^(自己做测试,所以就简单的建了个表)+ R) \. y7 B3 p* X
9 L4 ^3 a/ \. F0 D# ?; u, p
由Hibernate生成的Info.hbm.xml中是这样写的: 8 P+ p- t* T! y& N9 b% U; Q0 O, g+ y- }; b: e
2 e/ V2 Z# ?# r2 J: P8 ] B0 W& q% h5 D& G$ g
-----------------------------------------------------$ w. w* ]" H4 Q8 X
; Z! p, U+ O8 F- ~8 y+ d
<id name="id" type="java.lang.Integer"> ) U* L$ C& Z, G% N& t. ^: `6 C <column name="id" /> 1 ]3 y! }' }9 g O# m) x$ y <generator class="assigned"/> * _) P7 j$ E5 o k) r0 a/ n7 t. P* w </id> 1 [7 `3 m k- W3 f: y3 F, X2 Q) S8 D# t O) p# v g/ Q& w% S$ q) d7 i5 v
-----------------------------------------------------: K$ t& f! d( \* k
$ V- z0 b$ L" E' l" }
<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键) * H! t/ q, t; W ?$ A d+ L/ ~, z, g3 ?' X! o3 x
而我这里由于id本身就是主键,所以column的属性便是id . ~+ f4 L6 [4 i- p0 h2 Y! _4 R5 b0 u0 a+ `
下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:9 B/ @; J0 j4 H+ Z8 E6 C$ {; O0 B
C2 w7 O% z7 ]4 e& C-------------------------------------------------------------------------------- 6 j$ ]5 _- [: [9 R) u1 V7 a" Y; {0 _5 I8 I. C5 i. w! J9 _
“assigned”5 [; l9 l8 p* @0 e8 G' F2 ^1 a+ k
主键由外部程序负责生成,在 save() 之前指定一个。. m4 R0 s# r# T' J
% _/ Q+ T& g/ I. r g1 i: F
“hilo” ; j c* k J' D8 }- u& _通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。8 F( ~" g( O, ?$ K4 g- n3 `
: Q1 W" \; P9 `* s; W" W
“seqhilo” a6 V: t" S7 p' ^4 m7 P& F9 w与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。 2 ?& k [9 U, H! ?- u# d5 i% f8 Z4 _ W
“increment” 0 u% \' V& v2 x1 m7 e主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。. _3 U$ {; V# W* m, q! k7 M
3 G' F1 ?+ G8 Q" {
“identity” 9 `- i1 T' t: N采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。9 R1 q' u0 s2 _0 E9 U
/ b) B- w" H0 K+ ~
“sequence” 6 L |! n- _5 T6 `$ f9 n3 @$ v& L采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。, z/ T/ ?; ^) S. F2 a8 U
u2 F0 Q0 b0 e/ u) k8 T! Z“native” " H$ C% M" z/ D由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。8 d' n) h5 R" k \9 ^( z' ]+ m