Hibernate4.3在开发中的一些异常总结(持续更新)

简介:

目录(?)[+]

        当被错误折磨半天后,突然找到解决办法了,那种快感……不是东京热可以给的了的……好来,不闲扯了,这篇文章主要是记录hibernate在开发中所出现的异常,方便以后查看~

1.java.lang.NoSuchMethodError:

1.1 javax.persistence.Table.indexes()[Ljavax/persistence/Index

        这个异常是我在对实体类使用注解的时候发生的。从名称上看,是Hibernate做持久化的时候出现的异常,没有指定的方法,而且出现在Table上,所以很自然的去实体类中的Table注解上找原因。因为我是用MyEclipse逆向工程自动生成的实体类,所以出现了Table的注解,先看一下自动生成的实体类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Category entity. @author MyEclipse Persistence Tools 
  3.  */  
  4. @Entity  
  5. @Table(name = "category", catalog = "shop")  
  6. public class Category implements java.io.Serializable {  
  7.     // Fields  
  8.     private Integer id;  
  9.     private String type;  
  10.     private Boolean hot;  
  11.     //省略  
  12. }  
        我后面在网上查了下,有人说这是hibernate-jpa-2.1.jar的问题,并且只有当使用注解的时候才会出现,把注解

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Table(name = "category", catalog = "shop")  

             删掉 问题就解决了,这可能是Hibernate4.3的一个小bug。

1.2 javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;

         这个异常很明显是跟外键有关,hibernate4.3中在使用多对一映射时不能使用注解@JoinColumn(name = "account_id")。我在网上查了下,说是JAVAEE6.0中的  javax.persistence.jar与 hibernate4.3中的hibernate-jpa-2.1.jar冲突。所以现在有两个解决方法:

        1. 不写@JoinColumn(name = "account_id");

        2. 将工程中的JavaEE 6.0 Generic Libary移除掉,再加进来就可以了。

2. java.lang.NoClassDefFoundError

2.1  com/mchange/v2/ser/Indirector

        这种是Hibernate和spring整合的时候,报的错误,从exception看应该是缺少跟mchange相关的jar包,我查了一下,是mchange-commons-Java-0.2.10.jar,它是c3p0所需要的一个另一个jar包,c3p0除了需要c3p0-0.9.5.1\c3p0-0.9.5.1.jar之外,还需要此jar包,加进工程里就没问题了。

3. org.hibernate.hql.internal.ast.QuerySyntaxException

3.1 Category is not mapped [delete Category as c where c.id=:id]

        这个异常从提示中看,比较明显,Category没有匹配。针对xxx is not mapped问题的异常,我们主要从以下几个方面去排除:

        1)看看是否将Category类的映射<mapping....>添加到hibernate.cfg.xml文件中了,或者将hibernate.cfg.xml文件添加到Spring的beans.xml的配置中了。

        2)比较容易想到的是:hql中写的应该是实体类名,而不是表名。注意大小写。

        3)检查表中的字段和映射文件中的字段是否一致,检查字段名是否用了数据库中的关键字。

        如果都没问题,那此时肯定是崩溃的……比如我当时遇到这个问题就是……

        那么还有个地方值得注意:

        4)我设置了@Entry(name="Category),想要改表的名字不是设置Entity注解的name属性,而是设置Table注解的name属性。所以我直接将(name="Category")去掉了,这样就没有问题了。

4. org.hibernate.LazyInitializationException

4.1 could not initialize proxy - no Session

        这个异常从名称上看,应该是和懒加载有关,我检查了一下自己的注解,便知道问题出在哪了:在多对一映射中(比如Book和User),如果要查询多方(book),并且在注解中配置的是@ManyToOne(fetch = FetchType.LAZY),则表示查询多方的时候不关联一方,这样我在查询完后拿数据的时候,如果要从book中拿相应的User就会抛出该异常,解决办法就是将LAZY设置成EGER。

5. java.lang.ClassCastException

5.1 [Ljava.lang.Object; cannot be cast to cn.it.shop.model.Category

        这个是一个转换异常,我在hibernate中做级联查询时候遇到的,级联查询的hql语句为:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public List<Category> queryJoinAccount(String type) {  
  2.     String hql = "from Category c left join c.account where c.type like :type";  
  3.     return getSession().createQuery(hql)  
  4.             .setString("type""%" + type + "%").list();  
  5. }  
        当我要从返回的List中取对象的时候就遇到问题了:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void testQueryJoinAccount() {  
  2.     for(Category c : categoryService.queryJoinAccount("")) { //问题就出在Category c上  
  3.         System.out.println(c);  
  4.         System.out.println(c.getAccount());  
  5.     }  
  6. }  

        后来debug模式查看了一下,查询结果中保存的是一个数组,里面有Category和Account,因为做了级联查询,但是我从List中取出这个数组当然无法转换成Category对象了。解决办法就是在hql语句中加上fetch,让级联查询的Account加到Category对象中,这样返回的就是Category对象了。即:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. String hql = "from Category c left join fetch c.account where c.type like :type"  

        这样就解决了问题。

5.2 cn.it.shop.model.Product_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy

        这种问题和上面的区别是:上面无法转化成具体的类,这里无法转化成一个代理,我去网上搜了一下,原来是我工程中的jar包发生了冲突,看下面:


        把struts2.3.41中的javassist-3.11.0GA.jar删掉即可。

        欢迎大家补充,我会更新到文章中~

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!

-----更多文章请看:http://blog.csdn.net/eson_15


相关文章
|
5月前
|
SQL Java 数据库连接
Hibernate 批量操作来袭!掌握最佳实践,轻松应对数据洪流,开启高效开发新时代
【9月更文挑战第3天】在软件开发中,高效数据操作至关重要。作为流行的Java持久化框架,Hibernate提供了强大的数据库操作功能。本文探讨了Hibernate批量操作,包括批量插入、更新和删除的最佳实践,通过使用原生SQL和`Session`的`createNativeQuery()`方法,结合`addBatch()`及`executeBatch()`方法实现高效批量操作。合理设置批量大小、事务管理和性能测试是优化的关键。在实际开发中,应根据业务需求和性能要求选择合适的方法,以提升程序性能和可维护性。
316 3
|
5月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
97 4
|
6月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
417 0
|
6月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
83 1
|
Java 数据库连接
Hibernate异常信息
Hibernate异常信息
112 0
|
SQL XML Java
Mybatis01入门+使用和配置+面试题mybatis与hibernate的区别+ssm与ssh2开发对比
Mybatis01入门+使用和配置+面试题mybatis与hibernate的区别+ssm与ssh2开发对比
Mybatis01入门+使用和配置+面试题mybatis与hibernate的区别+ssm与ssh2开发对比
|
SQL Java 数据库连接
2021-5-14hibernate核心开发接口(API)(下)
persist() delete() 代码: update() 代码: 根据id 查询get() 根据id查询 load()
155 0
2021-5-14hibernate核心开发接口(API)(下)
|
XML Java 数据库连接
2021-5-14hibernate核心开发接口(API)(上)
0. hibernate应用程序体系结构视图 1. Hibernate 核心接口API ① Configuration接口 ② SessionFactory接口 ③ Session接口 概述 session对象的获取 a. 获取方式(两种): b. 两种方法的比较 session中的常用方法 CURD(增删查改) CURD-定义工具类 提取共享代码 创建HbnUtils工具类 类、表结构 CURD增删改的实现 save() persist() delete() update() 根据`id` 查询get() 根据`id`查询 load() `get()`和`load()` 区别
138 0
2021-5-14hibernate核心开发接口(API)(上)
|
XML Java 数据库连接
Hibernate简单注解开发和事务处理(四)下
Hibernate简单注解开发和事务处理(四)
281 0
Hibernate简单注解开发和事务处理(四)下
|
XML Java 数据库连接
Hibernate简单注解开发和事务处理(四)上
Hibernate开发时,有两种形式,一种是XML配置的方式,另外一种是注解形式的开发。 XML配置是,需要写一个实体类User,还要在它的同级目录下创建一个相对应的User.hbm.xml, 而注解方式比较简单,只需要在User类中添加相应的注解即可。
197 0
Hibernate简单注解开发和事务处理(四)上

相关实验场景

更多