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

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

异常十六

异常描述: 属性入口创建异常:不能定位字段也不能从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.StackOverflowError

异常原因: 是因为在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.FrameworkMethod 1.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.ParentRunner 3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner 1.schedule(ParentRunner.java:71)atorg.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)atorg.junit.runners.ParentRunner.access 000(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_][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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值