该用户从未签到
|
引起问题的原因:" d, p6 ~$ E% q7 Q7 a6 u7 B
; }$ f% ]+ f4 M+ {由hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。7 x( w) R$ Y% r
: |6 x7 ]: Z# `8 \; z' T+ @
首先我的表(Info)由两个字段组成,即:' P# y ]# Y/ x s: `
$ a- [! A4 {: M0 ?- k1 J
int id;//主建
8 K3 z6 g! G3 Z8 x6 z1 B! ^) M, F4 _+ H& K! F" f2 I- j6 J, H
String name;5 [ e# m0 i4 [0 {5 k- ~
8 X) Q3 Q. a l7 w(自己做测试,所以就简单的建了个表)
3 v- Y8 `# G0 T6 H3 Z) `0 \& I3 k T- i; P3 g/ [* [
由Hibernate生成的Info.hbm.xml中是这样写的:, d0 x6 l# T4 C0 f
6 Z# I1 B3 \1 g
! U: b! r* }/ G1 N) O8 P& h( z
% z+ C2 }1 n2 C! G+ c0 g B-----------------------------------------------------
6 P6 P0 e8 v* Q# ^- E; s8 D o' U8 e8 q, F7 R
<id name="id" type="java.lang.Integer">
: {9 S1 G. ~' W1 I <column name="id" />
) Y- y* b. {, k7 [9 E <generator class="assigned"/>0 V0 p, a: A {: \+ L
</id>
7 Q" Q: z+ B, {2 w+ v3 h6 o
6 {6 a2 Z5 R( ]8 j& i& X- p# \2 {-----------------------------------------------------
6 P; B# g, n X# Q$ \ o# {* g; B6 q# v
<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)4 p S2 s% c/ p+ k
9 h" Q4 ~9 p8 o
而我这里由于id本身就是主键,所以column的属性便是id
6 O7 D, a( Y6 J) r8 N
, L/ c# \, u9 J2 A; `下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:
0 U7 ]0 U& i: i1 | P/ ?
5 h4 ]9 D: @& p9 }+ m--------------------------------------------------------------------------------3 V! B0 }. ~" A3 O# S
: T: `5 F4 l# y" S- o- s
“assigned”
$ f# @. n8 o& r Z0 O主键由外部程序负责生成,在 save() 之前指定一个。
8 _+ U% T8 }. B/ a2 c6 N* R
9 ?) e. p8 o4 i6 G' K U" p4 C“hilo”
+ m% N% P: i% N4 {5 }7 o2 {) g) I- | s通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。8 q+ V: M7 m( J3 Y
* ^7 s$ E5 |. f0 a, n
“seqhilo”
9 i- B( y% c/ h3 K& y# n与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。* K$ ~( a* Z s) |$ V1 _- x' v
4 n, N b; v2 ?7 F5 X7 X“increment”) d1 s1 K$ `1 y) j7 H5 C# f
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
4 O4 ?% u E2 t, W' \2 ]6 M8 j% [$ o3 t( x) f$ `0 q
“identity”
+ Y- }6 E9 F) I采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
$ E" `! O2 N9 H+ P$ j2 t$ Z4 j) u
, j# s0 A! A" @/ g3 v“sequence”7 E& D" `8 Z7 {1 {8 `
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。4 L9 w) P: k4 v- {9 O' u
% L- M: A6 e" b' d2 ?/ |
“native”5 e4 D) V# g& `5 P% ?
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
; S, l) B# N" R2 d; f0 l+ M% C2 x" Y4 W
“uuid.hex”( s+ H% l7 J5 Z ]0 C
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
; R2 L/ r4 ^3 B7 E+ `0 |5 P0 p; V$ q O, b4 \
“uuid.string”
, n9 h2 F" ?2 R( b( w) ^5 f与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。. q& b7 u! p2 m! S, t% i
# _/ q; q8 i+ S: D7 P! |“foreign”
6 B. V# O* k5 k- M9 }2 F使用另外一个相关联的对象的标识符作为主键。
' D2 }$ p/ o4 `* y# D3 b0 x. N% T* j
! p+ J0 X8 Y! i- A7 c, I6 J! F, y0 Z$ D--------------------------------------------------------------------------------( w4 Q0 ?/ @) g
" ~. K5 _4 c' _0 V, C4 s看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。7 P: \, e2 ~7 j" D9 [
7 N9 N) N, m5 f" X" x
然后改为"identity"、"native"问题便解决。/ n) U' L b* O; N3 X, h# Q
+ V0 z4 H. C$ F4 s( ?
i- ^9 L" F% n% y6 z6 g$ T
|
|