当被错误折磨半天后,突然找到解决办法了,那种快感……不是东京热可以给的了的……好来,不闲扯了,这篇文章主要是记录Hibernate在开发中所出现的异常,方便以后查看~
这个异常是我在对实体类使用注解的时候发生的。从名称上看,是Hibernate做持久化的时候出现的异常,没有指定的方法,而且出现在Table上,所以很自然的去实体类中的Table注解上找原因。因为我是用MyEclipse逆向工程自动生成的实体类,所以出现了Table的注解,先看一下自动生成的实体类:
/**
* Category entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "category", catalog = "shop")
public class Category implements java.io.Serializable {
// Fields
private Integer id;
private String type;
private Boolean hot;
//省略
}
我后面在网上查了下,有人说这是hibernate-jpa-2.1.jar的问题,并且只有当使用注解的时候才会出现,把注解
@Table(name = "category", catalog = "shop")
删掉
问题就解决了,这可能是Hibernate4.3的一个小bug。
这个异常很明显是跟外键有关,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移除掉,再加进来就可以了。
这种是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包,加进工程里就没问题了。
这个异常从提示中看,比较明显,Category没有匹配。针对xxx is not mapped问题的异常,我们主要从以下几个方面去排除:
1)看看是否将Category类的映射
2)比较容易想到的是:hql中写的应该是实体类名,而不是表名。注意大小写。
3)检查表中的字段和映射文件中的字段是否一致,检查字段名是否用了数据库中的关键字。
如果都没问题,那此时肯定是崩溃的……比如我当时遇到这个问题就是……
那么还有个地方值得注意:
4)我设置了@Entry(name="Category),想要改表的名字不是设置Entity注解的name属性,而是设置Table注解的name属性。所以我直接将(name="Category")去掉了,这样就没有问题了。
这个异常从名称上看,应该是和懒加载有关,我检查了一下自己的注解,便知道问题出在哪了:在多对一映射中(比如Book和User),如果要查询多方(book),并且在注解中配置的是@ManyToOne(fetch = FetchType.LAZY),则表示查询多方的时候不关联一方,这样我在查询完后拿数据的时候,如果要从book中拿相应的User就会抛出该异常,解决办法就是将LAZY设置成EGER。
这个是一个转换异常,我在hibernate中做级联查询时候遇到的,级联查询的hql语句为:
public List queryJoinAccount(String type) {
String hql = "from Category c left join c.account where c.type like :type";
return getSession().createQuery(hql)
.setString("type", "%" + type + "%").list();
}
当我要从返回的List中取对象的时候就遇到问题了:
public void testQueryJoinAccount() {
for(Category c : categoryService.queryJoinAccount("")) { //问题就出在Category c上
System.out.println(c);
System.out.println(c.getAccount());
}
}
后来debug模式查看了一下,查询结果中保存的是一个数组,里面有Category和Account,因为做了级联查询,但是我从List中取出这个数组当然无法转换成Category对象了。解决办法就是在hql语句中加上fetch,让级联查询的Account加到Category对象中,这样返回的就是Category对象了。即:
String hql = "from Category c left join fetch c.account where c.type like :type"
这样就解决了问题。
把struts2.3.41中的javassist-3.11.0GA.jar删掉即可。
欢迎大家补充,我会更新到文章中~
_____________________________________________________________________________________________________________________________________________________
-----乐于分享,共同进步!