如果你急需解决问题,推荐跳转到本博客的精简版[点击此传送门]
首先声明:
本博客是因为在学习做一个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包.
经测试后增删改查功能全部正常,如果之后发现其他异常,再更…
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16684.html