欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

总结SSH阶段常见的异常系列之二hibernate续

程序员文章站 2022-04-12 21:00:04
...

我在学习Hibernate的过程中,踩了一些坑,由于配置文件的某个单词,或者大小写错了,而排查了两三个小时,很有幸能够看到一篇帮助我排查错误的文章。

文章地址: 总结SSH阶段常见的异常系列之二hibernate续   https://blog.csdn.net/zhouxingxing1992/article/details/54411855

原文内容如下:

异常十六

异常描述: 属性入口创建异常:不能定位字段也不能从name属性中获得get方法
错误在实体类cn.ticast.domain.LinkMan # lkm_cust_id中
异常信息: 严重: Servlet.service() for servlet [AddLinkManServlet] in context with path [/day01_hibernate] threw exception [Servlet execution threw an exception] with root cause
org.hibernate.property.access.spi.PropertyAccessBuildingException:
Could not locate field nor getter method for property named [cn.ticast.domain.LinkMan#lkm_cust_id]at
异常原因: 在创建主外键关联id(lkm_cust_id)的时候把该字段当做普通属性写入了LinkMan类中,并在LinkMan.hbm.xml中映射了该字段,导致后台程序一直报错。
解决方案: 在LinkMan类中去除lkm_cust_id这一属性,并在映射文件中去除这一列( ),问题可以解决

异常十七

异常描述: 服务异常:不能去创建一个被请求的服务
异常信息: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)

异常原因: 在进行两张表(customer和linkMan)关联数据的添加过程中,没有在主配置文件(hibernate.cfg.xml)中引入linkMan的xml映射文件,导致服务不能正常运行
解决方案: 在hibernate主配置文件中引入两个实体类的映射文件,问题可以解决
以下的配置都需要及时配置,如果没有及时配置就容易出错

异常十八

异常描述: Hibernate异常:方法DialectResolutionInfo 不能为空,hibernate方言没有设置
异常信息: Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when ‘hibernate.dialect’ not set
异常原因: 没有加载核心配置文件
//创建配置实例对象
Configuration config = new Configuration();
//加载src’目录下的配置文件
config.configure();
解决方案: 加载配置文件

异常十九

异常描述: 属性使用建立异常:不能找到属性名称uid
异常信息: Caused by: org.hibernate.property.access.spi.PropertyAccessBuildingException: Could not locate field nor getter method for property named [cn.itheima.demo1.domain.Demo1#uid]
异常原因: 类名写错

解决方案:
改成uid所属的类名

异常二十

异常描述: Hibernate异常:无法使用jdbc连接
异常信息: Caused by: org.hibernate.HibernateException: Unable to make JDBC Connection [dbc:mysql:///hibernate_day02]
异常原因: 核心配置文件jdbc连接写错

解决方案: 改成jdbc:mysql

异常二十一

异常描述: 数据异常:不能在Hibernate内部执行更新操作
异常信息: org.hibernate.exception.DataException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:52) at
…..
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘lkm_phone’ at row 1 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2983) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) at
异常原因: 造成的原因是数据截断:lkm_phone字段数据过长。经过仔细查看,发现在数据库见表过程中给lkm_phone这个字段的长度是一个字节,长度太小,导致数据空间不能存储
解决方案: 修改数据库表中该字段的长度,修改成给定字段长度20个字节

异常二十二

异常描述: 类型不匹配异常:为cn.itcast.domain.Customer类提供了一个错误的id匹配类型
异常信息: Servlet.service() for servlet [SaveLinkmanServlet] in context with path [/hibernate_my-crm2] threw exception org.hibernate.
TypeMismatchException: Provided id of the wrong type for class cn.itcast.domain.Customer. Expected: class java.lang.Long, got class java.lang.String at org.hibernate.event.internal.DefaultLoadEventListener.checkIdClass(DefaultLoadEventListener.java:166) at…..
异常原因: 在给customer类设定id字段时没有和其他类以及数据库类型保持一致,应该是给该类有关id类型都是设定为long类型,但是该学员在该类中给其中cust_id设定了String类型,就导致后台程序一致报错
解决方案: 重新修改cust_id类型,修改成Long类型,把后台其余的java类中和与此id匹配相关的类型 都由string修改成Long类型,问题可以解决

异常二十三

异常描述: 栈内存溢出异常:由于使用单元测试,所报的异常无法复制,所有截图,异常名称已经写出。
异常信息: java.lang.*Error

异常原因: 是因为在Customer类中,有一个set集合属性
Private Setset = new HashSet();
在重新toString()方法的时候,也将这个属性重写。
而在LinkMan类中,也有一个Customer属性。Private Customer customer;
在重写toString()方法时,也将该属性重写。在程序调用时,hibernate的session对象
Query query = session.createQuery(“from Customer”);
List list = Query.list()
For(Customer customer : list){
System.out.println(customer);
}这样打印输出时会循环嵌套输出,打印customer对象的时候,也打印出linkMan的set集合,而在linkman对象中又包括customer对象,所以会一直循环打印,所以栈内存溢出。
解决方案: 在重写toString()方法时,碰到这种对象相互嵌套的时候,就不要将这种set集合和对象类型写在toString()方法中即可。

异常二十四

异常描述: 该异常为类转换异常:String类型无法转换成User类型。该异常发生在:TestHbnt类的第61行。
异常信息: java.lang.ClassCastException: java.lang.String cannot be cast to hibernateLianxi_entity.User
at hibernateLianxi_text.TestHbnt.lianxi6(TestHbnt.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod1.runReflectiveCall(FrameworkMethod.java:50)atorg.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)atorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)atorg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)atorg.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)atorg.junit.runners.ParentRunner1.runReflectiveCall(FrameworkMethod.java:50)atorg.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)atorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)atorg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)atorg.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)atorg.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)atorg.junit.runners.ParentRunner3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner1.schedule(ParentRunner.java:71)atorg.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)atorg.junit.runners.ParentRunner.access1.schedule(ParentRunner.java:71)atorg.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)atorg.junit.runners.ParentRunner.access000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
异常原因: 异常原因:代码如下

Query query = session.createQuery(“select lkm_name from User”);

        List<User> list = query.list();
        for (User user : list) {
            System.out.println(user);
        }


    要查询的是lkm_name(即联系人姓名),为一个字符串类型。所以在执行query对象的list方法时,返回的list集合中的泛型应该为String ,而不是User类型

解决方案: List list = query.list();再去遍历List集合,就不会报异常。

异常二十五

异常描述: 该异常为:hibernate的查询语句异常,该异常发生在hql语句的第一行的14列,在属性cusName附近。
异常信息: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: custName near line 1, column 14 [select cid custName from Entity1.Customer]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:288)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:76)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1894)
at TestDemo.Test3.demo(Test3.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

异常原因: 把异常的hql语句为 select cid custName from Entity1.Customer,在查询不同属性之间缺少一个逗号,造成hql语句异常。
解决方案: 将语句改为select cid ,custName from Entity1.Customer,在两个属性之间加上逗号即可。

异常二十六

异常描述: Sax解析异常:在配置文件第9行77列的值‘com/redhat/manager/domain/Customer.java’不符合’ClassNameType’类型
异常信息: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 77; cvc-pattern-valid: 对于类型为 ‘ClassNameType’ 的模式 ‘([a-zA-Z_][a-zA-Z\d_][a-zA-Z\d_].)[a-zA-Z_][a-zA-Z\d_][a-zA-Z\d_]*’, 值 ‘com/redhat/manager/domain/Customer.java’ 不具有面有效性。
异常原因: ‘com/redhat/manager/domain/Customer.java’解析不了
解决方案: 改写成
com.redhat.manager.domaain.Customer

异常二十七

异常描述: 对象不唯一异常:在session里已经存有相同对象了。
异常信息: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.gongshi.domain.Customer#2]
异常原因: session中有2个oid一样的对象,hibernate不知道该让哪个持久化到库里
解决方案: 关闭上一次没有关闭的session

解决人:
备注: 1. 业务操作,开启一个session ,从中查出一些实体,这时某个实体是存在于session中的持久化对象。通过业务逻辑将此实体用于页面展示。此时这个session并未关闭。
2. 这时执行一步save业务逻辑,将上一步获得的实体id传回后台。这时通过new的方式创建了一个临时对象,并且我将传回的id作为主键赋值给了临时对象。然后调用了session.save(obj);
方法。。。抛出异常。

异常二十八

异常描述: 不支持的编码异常:这个字符编码“uft-8”是不支持的
异常信息: java.io.UnsupportedEncodingException: The character encoding [uft-8] is not supported
异常原因: 编码写错了
解决方案: 改成utf-8

 

相关标签: hibernate异常