为了账号安全,请及时绑定邮箱和手机立即绑定

Line number: 56,代码异常求思路

Line number: 56,代码异常求思路

海绵宝宝撒 2022-10-01 13:09:00
Struts Problem ReportStruts has detected an unhandled exception:Messages:    ids for this class must be manually assigned before calling save(): com.hime.system.model.SysBranch    ids for this class must be manually assigned before calling save(): com.hime.system.model.SysBranch; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.hime.system.model.SysBranchFile: org/hibernate/id/Assigned.javaLine number: 56之前是ID生成策略有问题,改过之后(如下的assigned)。又出现这个问题,求指导啊。下面是修改过的代码:@Id @GeneratedValue(generator="custom-id")@GenericGenerator(name="custom-id", strategy = "assigned")@Column(name = "BRANCH_ID", unique = true, nullable = false, insertable = true, updatable = true, length = 30)public String getBranchId() {return this.branchId;}
查看完整描述

3 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

你是不是有多表级联的?如果多表的话,估计没级联好,之前我也有类似问题,是因为是联合主键且主键又是外键,ID老是不对。后来就不搞了,把所有
@Id @GeneratedValue(generator="custom-id")
@GenericGenerator(name="custom-id", strategy = "assigned")
去掉,那么ID怎么生成呢?直接select max(id) from table然后结果+1
唉,没办法,联合主键且主键又是外键搞不来了~

查看完整回答
反对 回复 2022-10-06
?
绝地无双

TA贡献1946条经验 获得超4个赞

引起问题的原因:

由Hibernate根据数据库表自动生成的"类名.hbm.xml"映射文件引起的。

首先我的表(Info)由两个字段组成,即:

int id;//主建

String name;

(自己做测试,所以就简单的建了个表)

由Hibernate生成的Info.hbm.xml中是这样写的:

-----------------------------------------------------

<id name="id" type="java.lang.Integer">
             <column name="id" />
             <generator class="assigned"/>
</id>

-----------------------------------------------------

<id>这个是必须有的。它是用来定义实体的标识属性(对应数据库表的主键)

而我这里由于id本身就是主键,所以column的属性便是id

下面是很关键的一点<generator>,由于一时兴趣,于是找了很多资料,关于它的解释是:用于指定主键的生成策略。它的值有多,下面是转来的:

--------------------------------------------------------------------------------

“assigned”
主键由外部程序负责生成,在   save()   之前指定一个。
  
“hilo”
通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
  
“seqhilo”
与hilo   类似,通过hi/lo   算法实现的主键生成机制,需要数据库中的   Sequence,适用于支持   Sequence   的数据库,如Oracle。
  
“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
  
“identity”
采用数据库提供的主键生成机制。如DB2、SQL   Server、MySQL   中的主键生成机制。
  
“sequence”
采用数据库提供的   sequence   机制生成主键。如   Oralce   中的Sequence。
  
“native”
由   Hibernate   根据使用的数据库自行判断采用   identity、hilo、sequence   其中一种作为主键生成方式。
  
“uuid.hex”
由   Hibernate   基于128   位   UUID   算法   生成16   进制数值(编码后以长度32   的字符串表示)作为主键。
  
“uuid.string”
与uuid.hex   类似,只是生成的主键未进行编码(长度16),不能应用在   PostgreSQL   数据库中。
    
“foreign”
使用另外一个相关联的对象的标识符作为主键。

--------------------------------------------------------------------------------

看了上面的介绍,再看看代码,原来是<Generator>属性设置有问题。

然后改为"identity"、"native"问题便解决

查看完整回答
反对 回复 2022-10-06
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

你的配置的意思是,实体在保存之前,他的主键是需要显式的设置的,不能自动递增。

查看完整回答
反对 回复 2022-10-06
  • 3 回答
  • 0 关注
  • 366 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信