该用户从未签到
|
引起问题的原因:
\, p4 `) L; ^" N C
' c( O% S) `# R# d7 U( M& X由hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。4 |$ w" f8 x( ^6 C( I9 i4 d
/ ^0 z/ s! N2 Y7 @4 R2 H9 q4 O首先我的表(Info)由两个字段组成,即:
$ l2 N2 x2 c" A6 [* |7 C0 X- t. j2 Q; U
int id;//主建
( ?0 B8 g6 M! m S
# o) A& B4 v# l& U' D# nString name; y* S. u! Y7 ~+ H! o8 O) E. g+ A
: p( I( @0 E8 j9 j/ L. z
(自己做测试,所以就简单的建了个表)# }; b9 g+ ]: \9 i8 |
3 u* p+ g- u! z6 H8 Z
由Hibernate生成的Info.hbm.xml中是这样写的:
# M2 v$ [3 G/ {& H& u' M' Y
0 f r8 u7 d8 V' m- g
" O9 {7 M- h& H( l
( `+ s( I9 W- Z-----------------------------------------------------& ^ j9 T& H% {. f9 t. a7 C! j
: |, X& V! \: J0 L- ^<id name="id" type="java.lang.Integer">6 Z8 g$ Z) s! j, C# v1 J7 ~3 Y
<column name="id" />4 \) B3 R8 t, F
<generator class="assigned"/>' ]7 T! J' f! L8 V! |& G
</id>/ s/ c% O5 i: @& p
( B+ l: s5 D% n% Z+ X# q-----------------------------------------------------
d/ z# P2 d: w- i) w6 o# j, Z' X
2 \0 ?# {+ P6 Z; w3 A<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)
4 w9 Y+ Y, \0 ?% C* K9 B6 t# W" U- `& z; |. q3 n
而我这里由于id本身就是主键,所以column的属性便是id$ _- }, Q9 I; q$ X
- A, p9 o6 L$ D2 ?# b下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:
; x+ b1 n* E. I9 u- v
% C4 ]2 t, F' D+ L$ ~# L--------------------------------------------------------------------------------4 E3 C' l( Q8 |: w# W" x; }
9 ]5 k; M2 Y. Y h! f
“assigned”1 Y. a9 A- K; t5 I
主键由外部程序负责生成,在 save() 之前指定一个。
7 H" V9 }) o. K; m) ^" m
& v& ~0 `% z3 b5 F“hilo”
0 h% F3 K6 ^4 u8 Y3 Q/ M; m通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
# j W+ @) |- g# Q) H2 G5 c
4 I2 Y0 d' Q+ ~. k“seqhilo”
$ L. M2 ^0 W; E) p" S" t$ X/ n6 A与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。
$ v) q5 i+ i- ]+ W2 O5 P) u6 f( I) R
“increment”8 h1 Y2 C+ y, Z, C8 p
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。) D3 y- X' ]6 E0 G
! p* H' M; e$ T# ?3 ]/ F
“identity”$ ]5 c: [( j# _5 [5 i
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。. j% K+ D' p* X; g/ T& n9 V; b
# F8 w8 G. [1 A# I2 }3 l“sequence”7 y3 g) ~! X; q9 B, D
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
2 U9 A2 B/ v. |; L7 M
8 o' q j1 X1 V; a“native”
) a1 x \: k; ?- P7 h% Y W由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
0 V4 X1 z; D" ^1 D, M$ B, y) V/ V9 D1 {, U
“uuid.hex”: W& C" E% q! d2 s
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
" Y3 v7 w6 f$ E W9 [( B j) O7 _# Y) w9 o6 H
“uuid.string”! Y9 e' H# I! E, O
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。& J. l& t Z3 U, }
b0 S) G- q h“foreign”. k$ e o9 f& y
使用另外一个相关联的对象的标识符作为主键。: F8 c1 _' s4 K! @& a h0 p
) [# @7 [9 c7 h+ e
--------------------------------------------------------------------------------
9 l3 r: ?, s- w& o7 u* j+ ], V
/ P4 Z7 ]" d% N7 D5 e, R9 [看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。3 Q5 _- h7 V- o. i
, _- ]) W5 ~8 u; c5 f1 O
然后改为"identity"、"native"问题便解决。( X* m: R% r: \. Q
: i6 @0 I9 f; O8 M" n0 J3 I4 ^4 ]1 B. ?! C, e8 @" j! T0 l
|
|