该用户从未签到
|
引起问题的原因:
% x3 F5 U, ]) R$ p- T# b2 t P( S& {, }
由hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。
9 A. L" E$ [* s. ~5 n* S- d
' q# A) r( H) p. L( f7 \8 q首先我的表(Info)由两个字段组成,即:
' i& h1 a8 v5 z! ^2 ~
/ J5 g; W; @/ C. S; \) cint id;//主建( g' f, g2 l/ I, @
6 j" K' n0 J$ z6 C
String name;
m: l+ T* c, r3 _* e4 u; p6 j1 O# [& k& N0 m
(自己做测试,所以就简单的建了个表)! C& O+ x+ n5 C& T. O6 z4 `% b
6 k/ m5 [: j, \由Hibernate生成的Info.hbm.xml中是这样写的:
' y% W- x, I3 a& l. ?0 y$ Q" H1 [1 Z/ t5 f$ J: h5 O
5 S6 Q" N& d" }) v- d$ r$ E
5 q( E$ E2 c- ^& L7 Q! F-----------------------------------------------------( d3 A9 _; v" D4 w& `
4 B/ N! q6 O0 n; v7 S5 R<id name="id" type="java.lang.Integer">
G1 J+ l' o$ p1 X# e5 b* ? <column name="id" />* M6 {8 z. R y
<generator class="assigned"/>$ k: y/ D' O& i
</id>& L% }; S4 H6 j; I1 A! U U
% y$ V* ]5 r" ]; p! w
-----------------------------------------------------! D* \5 X$ E( A3 L5 V' k
% r) t6 e1 Y. s! _1 J: `# b
<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)
* I# t5 q- @, O! I6 @1 Z; u5 W0 L
而我这里由于id本身就是主键,所以column的属性便是id8 g& O$ j# B% k7 N" x0 x; q
: e, x& T$ `" W; O+ k9 P
下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:
* l3 G4 t" x3 n' \0 a; M
) Y& |: l7 r; F4 X7 \. d J--------------------------------------------------------------------------------/ Q" j* \( I2 @, S+ n- N7 z
% |, ]- {8 s; v“assigned”8 c7 X6 v3 O# M% _& V) G
主键由外部程序负责生成,在 save() 之前指定一个。
& T$ L( R; @" `
/ ]4 o2 _0 e# r( |, F- R“hilo”; b) V4 J7 s% h5 G
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。* l; \8 K! e. H- P1 l @5 W
v; z: m3 w$ Y9 S7 V“seqhilo”
$ U# b6 A4 q1 g9 A4 L$ P与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。+ k8 c1 r9 g- h5 m: m
Q& y! Y, e: F# }8 d4 f
“increment”4 f; W( H5 D7 r' F& {. {$ @: ?, e. G/ h
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
0 X1 b6 n! ]8 R5 b6 a. X1 v! ^+ t# r8 y
“identity”+ [6 K2 I7 c. F) o' I# j. G% Z
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
6 f+ ~3 T1 X& x; i( R$ l
# A# W- M* H/ h; x$ x“sequence”9 p5 Z2 g& [9 V* h
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。) y) p0 N# u* w
1 x8 c# B p7 @" S“native”
" c% i1 N. U* N) X( E" S, {2 C由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
$ | F) S l9 T/ a" O# U5 ]7 f1 e9 r+ [/ c* X0 m
“uuid.hex”
' w% C. ]0 _5 d* F1 ]由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
* j7 B! A: n* H, _3 Q, l+ \7 D2 Z) j$ R9 J& ~3 I, V& M1 o- T. S r
“uuid.string”
0 q2 A2 ?, F" X9 e V, k. n. o与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。* r8 f7 J9 n2 f a+ ?! Y% |
: e) J' K- } n“foreign”; U8 q2 P3 o4 q6 H( C9 S$ o
使用另外一个相关联的对象的标识符作为主键。
8 x- @0 s0 o! l; `! |6 `, R; P6 v% I( X0 j
--------------------------------------------------------------------------------. N) C9 x$ V" u; q }) V
4 j7 G; B- K3 Q) @2 A4 p/ Z9 D" B, q
看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。& z" v- r) a2 n7 ?, F. }
. H1 [5 r! A7 D7 h
然后改为"identity"、"native"问题便解决。5 I. _7 }9 ~% R# i/ l
" d) @9 ~2 F# y& ]6 a0 l6 N
6 p! B. A# a7 m8 w$ ~8 C
|
|