总结SSH阶段常见的异常系列之二hibernate续
我在学习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