该用户从未签到
|
引起问题的原因:0 u/ e3 _3 Q7 ^" n2 V% U
2 j8 G& v1 h+ g' p4 U
由hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。/ v2 m# W6 m' d+ z. I1 X# e
\5 ~. b6 l( j2 K% |
首先我的表(Info)由两个字段组成,即:
/ F% {( ?- @8 ~% s# {4 ]6 G1 w
# m5 O; Y0 X1 z3 _4 h4 l1 uint id;//主建8 _2 O9 a8 R/ X' [
* ~& ^9 I# m* O8 x6 T
String name;$ R# v2 g n: i1 Z( ^) m q
* H& t: G0 Z6 _& ~# L- K
(自己做测试,所以就简单的建了个表)" H% G% Y" Z7 b3 x
, n8 Q% P$ h# ^0 f; G1 Q7 G2 x* D由Hibernate生成的Info.hbm.xml中是这样写的:
2 X* K" C! M3 ~$ i" f2 F
& S: y. t9 D: W9 ?: K
4 q0 e& e& `1 H9 ~- t
7 e7 c# Q8 r, _0 L* x( I# {-----------------------------------------------------
0 g& X+ x5 U Y: \) w c$ S) R2 R2 X- Z
<id name="id" type="java.lang.Integer">8 l! O2 M+ S+ u% N
<column name="id" />
6 }$ m. Z% d% w+ v9 N( @ <generator class="assigned"/>8 k% ~1 z! D3 Q3 p
</id>4 |! `; _! w7 p# U
1 _0 B5 q, U" E" m4 g, k# r-----------------------------------------------------2 \8 `1 m6 M) U" K
0 R5 r2 X5 S, R- N
<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)
/ j( c5 ?# u; g" j- x6 m) c2 J# H( ]
而我这里由于id本身就是主键,所以column的属性便是id
4 a/ w1 [+ }0 Y( {
9 e/ b( ^; G9 L& i7 r$ i下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:
+ a& U5 J+ H e( j7 C. T/ R: [% z: L+ n$ A& c$ C
--------------------------------------------------------------------------------/ Z: x6 h3 }9 z+ e9 q, s' M) i
9 `+ I5 n/ U- B2 f' Z2 ~% H“assigned”- q- y/ o6 b9 g3 t
主键由外部程序负责生成,在 save() 之前指定一个。2 y0 r, e# |6 ]6 \! J/ s
- }( Z/ N) \3 c- J% Q' b+ w1 R“hilo”
A. _& y, d) S9 L" h通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
6 h1 |' S1 F O. \
% \% q4 z7 D6 B; L“seqhilo”
/ ]1 U- D+ y! x% Z与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。0 Z6 ?1 x4 s9 ]
% X5 F5 M2 R$ ^+ R2 t+ s“increment”& r! o5 J5 d. a: A1 y
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。6 x5 c- {9 H" Q! P, Y" n1 P% M' }3 s6 ^
( O2 s* C% n" C7 S% b
“identity”
) o6 m; N/ R: w采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。, ~3 e- _3 {% |/ H
# }( ?6 M7 [9 |- ?/ y, U“sequence”4 n9 x% d) m* d; c! e4 j$ `( y
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
" u9 t* {% i6 W" y
4 m8 c3 j% R- J8 h, [0 [2 X; o“native”
`9 ]2 Z6 ]$ v A3 `由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
/ P1 w/ F( G5 ^- |7 N+ R9 k1 ? R% |: W9 T0 A# `- C
“uuid.hex”
3 o/ f' k0 m5 r2 F3 q' u由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
" Y# j. E. s) r7 W( e5 C4 Z O6 }4 ^/ ^
“uuid.string”- Q5 T% S3 P2 l4 K$ A
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。
3 J+ G$ m5 U ?6 c, ?
' b/ c6 O4 |* J8 a" P3 E5 }“foreign”. z0 y( W w; x3 l- P2 Q8 C
使用另外一个相关联的对象的标识符作为主键。
5 W% K% f7 O$ o8 r) B! m4 e0 r8 @- x. M1 z& a
--------------------------------------------------------------------------------
1 }: x* p& g/ b% ?( H+ o. G8 e9 l1 O1 M. X
看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。
+ F9 e9 w, G4 a" w3 q/ P4 \+ c
; ~# T0 v* a- c$ a; {6 F: x然后改为"identity"、"native"问题便解决。, Q" q7 j5 U" a# B) Q. {( C# W
% Z& d! Q' f8 z0 O5 A
3 Y/ Z8 ?7 e4 i) o$ S |
|