Java hibernate 遇到的问题:could not read a hi value

在使用spring-data-jpa进行开发的过程中,在向数据库中的某张表中添加一条记录时,hibernate出现了如下错误:

在这里插入图片描述

根据错误描述,需要在数据库中添加表:hibernate_sequence。但是我在使用领域(domain)驱动建模生成数据表时,并没有要求生成这个表。那么问题出在什么地方呢?使用数据库图形化界面查看的生成的数据表。
在这里插入图片描述

很奇怪,这个表在hibernate自动建表时,就随之创建了。由于上面报出的错误是:id标识符生成异常,这个错误是否是由于id主键生成策略导致的呢?查看添加数据时操作的实体类

在这里插入图片描述

在这里插入图片描述

通过查看@GeneratedValue源码,发现采用注解@GeneratedValue来设置主键id,在没有给出指定的生成策略时,JPA的默认主键生成策略是上面截图所示。所以此时,@GeneratedValue 等价于 @GeneratedValue(strategy = GenerationType.AUTO)。采用默认的主键生成策略GenerationType.Auto,会把主键生成策略交给JPA厂商(Persistence Provider),由它根据具体的数据库选择合适的策略。通过查阅资料发现,JPA厂商(Persistence Provider)选择了如下的主键生成策略。

在这里插入图片描述

所以正是由于使用了JPA的默认生成策略GenerationType.Auto,才会导致在使用hibernate自动建表时,数据库才会创建了hibernate_sequence表。并报出了如下的错误:

org.hibernate.id.IdentifierGenerationException: could not read a hi value - you need to populate the table: hibernate_sequence

找到问题的所在,就好解决了。

只要改变JPA的默认主键生成策略就好了,处理方法:
设置主键生成策略为:@GeneratedValue(strategy=GenerationType.IDENTITY)(主键id自增)

修改完成后,重启启动tomcat服务,尝试向数据库中指定的表中添加一条记录。这时,又出现了新的问题。

在这里插入图片描述

已经把主键生成策略修改为主键ID自增,怎么还会出现这样的问题?查看数据表结构
在这里插入图片描述

发现在实体类中修改的主键生成策略,工程启动时,hibernate并没有把修改同步到数据库的这张表中。这时,手动把主键自增这项勾选上。重启tomcat服务,再次向这张表中添加数据。

在这里插入图片描述

在这里插入图片描述

控制台输出添加成功的sql语句,数据库表中也多了一条记录,数据添加成功。问题得到了解决。

新手创作,所以分析的不到位,往大家补充完善。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值