我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > ids for this class must be manually assigned before ...
总共48087条微博

动态微博

查看: 1104|回复: 0

ids for this class must be manually assigned before calling save():

[复制链接]

57

主题

5

听众

129

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-11-26 16:02:43 |只看该作者 |倒序浏览
引起问题的原因:" m/ O  k; _0 T. x. G3 ]5 C+ e

- n, I( Z# I. _/ Zhibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。
& z9 V$ Z% y! G+ K% m$ W0 C7 Y! k  p  g# w. m/ [2 \) G0 f
首先我的表(Info)由两个字段组成,即:/ }4 J5 U4 u2 q, Z: @

% r0 f! n1 a& j$ h: w! Qint id;//主建& l% @, e- v* o. _8 v

7 ]% ?) v  w- N( t5 _+ K* bString name;6 O4 s! m, J9 ]& a! t+ z

8 Y/ P6 g$ d  {3 ^(自己做测试,所以就简单的建了个表)+ R) \. y7 B3 p* X
9 L4 ^3 a/ \. F0 D# ?; u, p
由Hibernate生成的Info.hbm.xml中是这样写的:
8 P+ p- t* T! y& N9 b% U; Q0 O, g+ y- }; b: e

2 e/ V2 Z# ?# r2 J: P8 ]  B0 W& q% h5 D& G$ g
-----------------------------------------------------$ w. w* ]" H4 Q8 X
; Z! p, U+ O8 F- ~8 y+ d
<id name="id" type="java.lang.Integer">
) U* L$ C& Z, G% N& t. ^: `6 C             <column name="id" />
1 ]3 y! }' }9 g  O# m) x$ y             <generator class="assigned"/>
* _) P7 j$ E5 o  k) r0 a/ n7 t. P* w </id>
1 [7 `3 m  k- W3 f: y3 F, X2 Q) S8 D# t  O) p# v  g/ Q& w% S$ q) d7 i5 v
-----------------------------------------------------: K$ t& f! d( \* k
$ V- z0 b$ L" E' l" }
<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)
* H! t/ q, t; W  ?$ A  d+ L/ ~, z, g3 ?' X! o3 x
而我这里由于id本身就是主键,所以column的属性便是id
. ~+ f4 L6 [4 i- p0 h2 Y! _4 R5 b0 u0 a+ `
下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:9 B/ @; J0 j4 H+ Z8 E6 C$ {; O0 B

  C2 w7 O% z7 ]4 e& C--------------------------------------------------------------------------------
6 j$ ]5 _- [: [9 R) u1 V7 a" Y; {0 _5 I8 I. C5 i. w! J9 _
“assigned”5 [; l9 l8 p* @0 e8 G' F2 ^1 a+ k
主键由外部程序负责生成,在   save()   之前指定一个。. m4 R0 s# r# T' J
% _/ Q+ T& g/ I. r  g1 i: F
“hilo”
; j  c* k  J' D8 }- u& _通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。8 F( ~" g( O, ?$ K4 g- n3 `
: Q1 W" \; P9 `* s; W" W
“seqhilo”
  a6 V: t" S7 p' ^4 m7 P& F9 w与hilo   类似,通过hi/lo   算法实现的主键生成机制,需要数据库中的   Sequence,适用于支持   Sequence   的数据库,如Oracle。
2 ?& k  [9 U, H! ?- u# d5 i% f8 Z4 _  W
“increment”
0 u% \' V& v2 x1 m7 e主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。. _3 U$ {; V# W* m, q! k7 M
3 G' F1 ?+ G8 Q" {
“identity”
9 `- i1 T' t: N采用数据库提供的主键生成机制。如DB2、SQL   Server、MySQL   中的主键生成机制。9 R1 q' u0 s2 _0 E9 U
/ b) B- w" H0 K+ ~
“sequence”
6 L  |! n- _5 T6 `$ f9 n3 @$ v& L采用数据库提供的   sequence   机制生成主键。如   Oralce   中的Sequence。, z/ T/ ?; ^) S. F2 a8 U

  u2 F0 Q0 b0 e/ u) k8 T! Z“native”
" H$ C% M" z/ D由   Hibernate   根据使用的数据库自行判断采用   identity、hilo、sequence   其中一种作为主键生成方式。8 d' n) h5 R" k  \9 ^( z' ]+ m

! w/ Y- A$ P1 y/ I4 g3 F0 ?9 c0 V“uuid.hex”, ]( K) y/ K4 ?$ H
由   Hibernate   基于128   位   UUID   算法   生成16   进制数值(编码后以长度32   的字符串表示)作为主键。
1 l9 ~2 u+ r0 r2 E
  V+ ?/ L' E0 d# c“uuid.string”
  q' M+ b* O2 Q8 Q# {) d- N  J与uuid.hex   类似,只是生成的主键未进行编码(长度16),不能应用在   PostgreSQL   数据库中。- Z2 y" A% w0 Z# b  w8 s

+ ^2 K5 ^0 o- `“foreign”
/ \2 }1 Q; j7 k$ r3 o! v6 n使用另外一个相关联的对象的标识符作为主键。
) X9 w! h# B; b6 J7 ~1 p3 R( h3 b; H' N3 ^4 [- x
--------------------------------------------------------------------------------+ ?' o1 T+ B8 d/ l! j- d

! j# a( B: U  x# J8 n/ a1 z看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。
( Z1 o3 W6 S5 R3 S: i+ J/ t, |5 g$ f9 @! K6 o: r: z
然后改为"identity"、"native"问题便解决。7 L: B6 @/ W. m% e
1 [* w/ d0 H; {, V" B4 b
! ]$ k5 x! F7 w  ^5 \5 L& v. P

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表