该用户从未签到
|
引起问题的原因:
8 ^0 s' Z; l, k# \6 ~' J; j4 l0 C5 H; l6 i; b% [- b
由hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。
9 V; J( a6 Y! q; o4 Q
$ V% P e/ h' b, [9 I) [: L# S首先我的表(Info)由两个字段组成,即:# k1 z! N7 R+ w: b7 K& }
+ z# }! R! x5 E! t# I% o5 @5 Oint id;//主建
7 u9 v1 N" }: l+ { q' p4 _
% F; h0 ^' z2 @4 l' T: b$ CString name;
% t7 P5 n- W( x8 x2 y1 c9 }3 w' f: u2 }1 Q [6 B& G0 l
(自己做测试,所以就简单的建了个表)8 t7 m. [* I1 C" e; z# R
8 c0 ~& h0 n7 n+ V' w
由Hibernate生成的Info.hbm.xml中是这样写的:
1 D+ N) t9 T! o5 |+ b9 I5 A' l! L. u/ K2 |* z( X
: w L @7 K7 J; q4 H
, y, G8 J. ]. z3 ^" l4 t* o9 m6 n0 F! F-----------------------------------------------------+ L" Z. W% U8 V+ E2 K& T
+ I: `- b! v2 \( Q1 k3 {% A' p<id name="id" type="java.lang.Integer">
0 q; G" @# \4 K5 I$ V9 Z4 }% | <column name="id" />
% E( E W4 D1 q% c/ c% ^& g <generator class="assigned"/>: i# z; K, r) C: p4 a
</id>+ d+ b# v, ^" g; D5 \
T( l. q' Z2 n
-----------------------------------------------------1 U3 M1 | a8 e
$ M; \, e' ^, s
<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)
% J9 S8 ~( \0 ?3 d& d: V2 A" y8 I
! r. k5 x. u, `: M: x. k$ }) _5 j& H而我这里由于id本身就是主键,所以column的属性便是id
; T, s3 {8 v: v- l; r3 d- p# B4 V& M
下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:
5 A1 ]! G" Z; O/ H
% @9 d) T8 W6 |9 ~--------------------------------------------------------------------------------
8 H/ j v' R1 p y4 R) q9 ]1 U
( Z$ ?/ D* \, u“assigned”4 g5 g4 }( a8 E$ j' o
主键由外部程序负责生成,在 save() 之前指定一个。3 c( v1 ~/ q& w
1 v3 a& r, z$ {- g“hilo”' T" a( ` o4 _; Q2 j0 b. |
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
% H5 o0 V2 b8 c! H% A$ z
% }: q+ S) L5 D! b1 n0 E. W“seqhilo”
$ U( e4 _) o0 ?/ X5 U) u% j7 {与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。: R n6 z2 z6 V6 Q( N4 d1 n
& n6 n5 L# t$ H9 r' g. [“increment”9 b1 B9 G" @) }3 M/ y3 N
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
7 @( H. K+ F' j3 _, X) a4 p. b
& F3 f2 q- y2 s# d“identity”5 v7 I% c2 {4 X2 x( _! T" H
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。( k3 Z9 v& V% @: c# Y- ~
. N: V j# V- I o“sequence”3 e# g2 V( D6 G# j' ?, k
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。# \+ H1 u9 }- L. L( y# G
+ G% T; b, @, A' x# [+ z
“native”
3 r( w" M, v% M" O' X1 w) w D由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
/ h9 I. H8 l5 |3 o6 s+ f1 Q, i
9 _7 ]3 m) w- c s“uuid.hex”
4 q4 [: H [ i3 g6 K2 @7 H0 A由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9 r, }0 i4 C6 j' Y
: n/ ?4 }8 t. r& T3 h9 I2 a“uuid.string”) b H9 \" u4 \0 ]: H
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。 @" T$ j# E. ? V
) Q! F5 p8 f! W$ V
“foreign”
1 O( R/ x2 P" {使用另外一个相关联的对象的标识符作为主键。3 ?& }" W* Y" x- J
5 R3 }, N' \. L( F F
--------------------------------------------------------------------------------( E D. V8 J. o: f0 K' h& a
0 k( b/ O& w' r- {; w, _! z
看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。
7 ~8 H) `% K5 F/ p4 ^, s. V
9 f+ C1 J. Y0 ~0 d; G然后改为"identity"、"native"问题便解决。
4 c$ A! M0 s" Q: T
Y0 b9 L2 [0 X# G4 `4 g$ E
, `. T6 m9 P4 Z$ c& C" p( ~ |
|