Hibernate注解开发时自动建表缺少外键系列问题(详细版)

如果你急需解决问题,推荐跳转到本博客的精简版[点击此传送门]

首先声明:

本博客是因为在学习做一个CRM项目时遇到的一系列问题,这个问题困扰了博主大概3个多小时.虽然这个过程遇到了许多个异常,但是本博主准备整合在一个博客中记录下来.由于博主能力有限,只提供了当时博主的解决方法、心路历程以及简单的说明.如果可以的话,博主也希望自己能够在将来能够回来再做个详细的说明指南.如果这个博客有幸被你看到,希望能够为你提供一个解决思路,帮到你是我的荣幸.当然如果被大牛看到,更是希望能够得到你的指点,不胜感激.

背景描述:

今天在练习做CRM的SSH项目,当时在做联系人相关功能模块,所以首先需要创建联系人表,并且与客户表进行外键关联.客户表之前已经创建好了,准备用hibernate的注解开发自动建表并创建外键.之后一系列问题就开始了.

1.开发环境:

IDE: IntelliJ IDEA 2018.3
Server: Tomcat 8.5.31
Java EE version:java EE 7
Web Application version: 3.1
Database: MySQL 8.0
JDK: 1.8
Spring:4.2.4
Struts:2.3.24
Hibernate:5.0.7

Jar包全家福:

在这里插入图片描述
在这里插入图片描述

2.问题描述与解决

当启动服务器后,设想是数据库自动建好cst_linkman表,并且cst_linkman的lkm_cust_id字段与cst_customer的cust_id主键字段产生多对一外键关联,然后开始报错:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Unable to execute schema management to JDBC target [alter table cst_linkman add column lkm_qq varchar(255)]
org.hibernate.tool.schema.spi.SchemaManagementException: Unable to execute schema management to JDBC target [alter table cst_linkman add column lkm_qq varchar(255)]
java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load []. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.

在确认自己码代码无误的情况下,开始各种查资料,尝试了许多办法,比如说:
1.在Stack Overflow上看到说当使用数据库的用户权限很高,并且不同的数据库中有相同名字的表,可能导致hibernate有异常,所以我删了其他库中相同名称(cst_linkman)的表,但是问题没有解决.
2.在Spring的配置文件application.xml中,数据库方言的设置问题
这是我原来的设置方法
org.hibernate.dialect.MySQLDialect
后来根据网上的方法换了:MySQL5Dialect,MySQL5InnoDBDialect,MySQLInnoDBDialect
都没有用
3.后来自己隐约发现可能是自动建表语句的问题,就删了下面这句,发现确实不报错了,但是不会自动创建表了,这种解决办法哪行,继续想解决方法.
update
等等…

随着看的博客的增加,应该是让我感到了一点蛛丝马迹,我看到了一篇博客提到了一种方言MySQL8Dialect,让我想到自己的数据版本是8.0,那会不会就应该用这种方言呢,所以抱着试一试的心态去修改代码,结果,令人糟心是没有发现这种方言,这就又让我想到会不会我的hibernate 的版本太低,所以没有这种方言,那我就去重下hibernate.

我下载的是hibernate的5.4版本,我们把下好的hibernate-release-5.4.0.Final文件夹解压打开,其lib目录下的required目录打开,这些都是hibernate的依赖包,是都需要的.然后打开lib,目录下的option中有一个c3p0的目录下的jar包也都复制粘贴到项目工程.这样删除之前版本低的jar包,更新了hibernate版本后运行了程序.
在这里插入图片描述
在这里插入图片描述
心喜的是没有报任何异常,并且在控制台里看到hibernate自动建表并创建外键的语句.可是随后,短暂的高兴停止了,检查了数据库后发现并没有创建表,但是能在控制台看到hibernate在建表所以很奇怪.随后把方言改为MySQL8Dialect,这个版本可以找到这种方言了,然后又试了一次,终于,成功了!表成功创建,并且是有外键约束的.
在这里插入图片描述

3.扩展问题的描述与解决

虽然我最初的目的达成了,但是毕竟我换了hibernate的版本,我怕的是版本兼容的问题,于是开始调试之前已经做好的功能.果然不出我所料,

1.首先我在调试涉及查询语句的功能时出现了异常:

java.lang.IllegalArgumentException: org.hibernate.QueryException: Legacy-style query parameters (`?`) are no longer supported; use JPA-style ordinal parameters (e.g., `?1`) instead : from cn.itcast.domain.BaseDict where dict_type_code=? [from cn.itcast.domain.BaseDict where dict_type_code=?]

解决方法:将原来有?号的代码:

hibernateTemplate.find("from BaseDict where dict_type_code=?", code);

改为在?号后面紧跟一个数字0:

hibernateTemplate.find("from BaseDict where dict_type_code=?0", code);

重启服务器后,涉及查询这部分功能正常,这使我们能够测试增删改相关功能,不出所料,

2.增删改相关的功能也出现异常,诸如:

ognl.MethodFailedException: Method "delete" failed for object cn.itcast.action.CustomerAction@219d879 [java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode;]
java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Lorg/hibernate/FlushMode;

解决办法:升级Spring版本,在这里我选择升级到5.0.2,下载好并导入使用到的jar包,替换掉之前低版本的jar包.

在这里插入图片描述
经测试后增删改查功能全部正常,如果之后发现其他异常,再更…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值