引起问题的原因: 8 I. I7 W, F) o6 J # A% u X2 D9 o% F- m由hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。 & a, U' A [5 A' B' u3 }' g% M% k: W+ ~ ' z9 H+ F( a' ~* `首先我的表(Info)由两个字段组成,即:- W# ], M9 R3 O
, L0 g0 t" C, t+ H# t, N+ y
int id;//主建! d7 L [( F/ Q, i' R
7 K/ `5 h% W" x1 D z/ TString name;& H4 y% Y2 Q2 h& ]0 v k8 z. @
2 X1 V, E$ o7 j2 G
(自己做测试,所以就简单的建了个表)) K- ~% V* e7 y7 t) R. S
}- }8 s- A4 }$ @5 L% {
由Hibernate生成的Info.hbm.xml中是这样写的: , D* k6 |6 @, Q" A1 b" @, E. Y' t/ X+ z j
% r3 {+ G" C6 L$ Y* Z( u
! B) D! p" }) l8 R-----------------------------------------------------$ k4 @% J# Q) ^; N; \
# l7 v7 A/ }! I
<id name="id" type="java.lang.Integer"> : d j+ x9 \8 A6 ?% Z x: w6 g0 { <column name="id" /> ( L& F8 p+ o; g- ?( Z <generator class="assigned"/>. Q- P+ q3 [5 c- f% H
</id>& L$ _( [% d' f+ ]( k% G9 n/ K
" | Y. b/ Z4 H. J2 g! M----------------------------------------------------- 7 d3 [/ n* S2 O, E/ p4 g) F- T9 s* F& d# P4 W/ K
<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键): C8 O1 u2 E; q* b6 v, A4 Y
8 E8 v3 r2 M/ F4 _8 t0 O而我这里由于id本身就是主键,所以column的属性便是id ; K1 N( ~. y9 Q( f6 x1 [7 o4 d% o: s" q* y& l
下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的: ) y, y9 l- i: |3 a P/ p* O! ^" ~ # H8 n: y0 F# f-------------------------------------------------------------------------------- # z- X+ y. x& S1 o 3 d/ D7 a. k. O4 l“assigned”# w7 s' _2 c; D8 _
主键由外部程序负责生成,在 save() 之前指定一个。 ; n3 `5 p2 t1 C; |3 ` + |8 p* Z; p; q+ N% s“hilo”8 g* b& @' S* K; y4 X& ?0 V3 w, T
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。 ! f$ l4 S+ c- L# h6 `1 a! I : F; w2 n, p p' @- @“seqhilo”8 l* {4 I2 U( y' L) Z
与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。 & v( _, J# [- d- u " O k7 k+ V3 z/ B“increment” $ f. F/ R# S$ L, O% w$ }- H1 w% h) I# h主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。' t4 ], _: Q+ }# r4 j8 O
% Y# O h2 o- c% l! J
“identity” 0 Q" H. w& z% z2 D7 O. G: g6 Z采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。, |# h" W; r6 z9 E( @- r
! B; M2 F: m) ]* T) Y$ W* ~8 v
“sequence” , Y- ~' N* V: U5 A1 t$ [, E采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。 6 Z: t2 j, }- f$ R3 U9 s2 z3 F4 g4 E+ M, e( F) a
“native”2 S- B5 W0 C" O4 D1 o& `1 y k7 C: z
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。 7 o- O) k* F2 E; c& R+ b7 S0 h: ^( N5 S3 h( v
“uuid.hex”8 K& ^6 n3 M( H, W5 p/ c) E' H
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。 O/ w( N$ c V& O+ d