Hibernate常见异常

本文针对Hibernate框架使用过程中常见的五种异常进行了详细的分析与解决方法介绍,包括Criterion未找到、IdentifierGenerationException、PropertyValueException等错误及其对应的配置调整和代码修正。
摘要由CSDN通过智能技术生成

1.      org/hibernate/criterion/Criterion

工程布署的时候没有加入hibernate3的jar包,这个jar不是默认加入的,要在myeclipse -> add hibernate capabilities... ->选择copy checked libraries to project folder and add to build-path否则工程布署的时候无论如何是不会有hibernate的包的。

2.      org.hibernate.id.IdentifierGenerationException

当出现org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():异常时,一般是因为<id>元素配置不正确,<id>元素缺少其子元素<generator></generator>的配置引起。

解决方案:<id>元素映射了相应数据库表的主键字段,对其子元素<generator class="">,其中class的取值可以为increment、identity、sequence、hilo、native……等,更多的可参考hibernate参考文档,一般取其值为native 。

generator class="assigned“而类型type="java.lang.Integer”如果主键时自动增长的Int型,把assigned改成自动增长的Identity,assigned是自动增长的varchar型的。

3.      org.hibernate.PropertyValueException

数据库的表里字段设有not null,执行dao.delete(op); 时出现异常:

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.easyfile.util. Operators. operatorid

在OperatorsDAO.java中private static Logger logger = Logger.getLogger(AdminAction.class);这句并没有显式地自动加载Id过来,还是需要dao.getSession().load(op,op.getOperatorid());来加载id。完整的代码如下:

String operatorid = request.getParameter("delOperatorid");

OperatorsDAO dao=new OperatorsDAO();

Transaction tran=dao.getSession().beginTransaction();

Operators op = new Operators();

op.setOperatorid(Integer.parseInt(operatorid));

dao.getSession().load(op,op.getOperatorid());

dao.delete(op);

tran.commit();

dao.getSession().close();

4.      null id in entry (don't flush the Session after an exception occurs)

产生该异常信息有2种可能:

Ø         我们没有为数据中的非空字段设置值。如果我们在通过Hibernate增加一条记录的时候我们必须显式的通过setXxx方法为该属性赋值(/默认值)。因为在保存之前Hibernate会检查该非空字段对应的实体属性是否为空。如果不想显式赋值的话,我们可以通过xxx.hbm.xml配置文件来实现,也就是在配置文件中给出该字段的默认值。或者在你的类中设置默认值就行了。注意的是rename数据库保留字段。

Ø         在hibernate的配置文件中,有的元素有unique属性的配置,它在数据添加时并不起任何作用,只在从hbm文件生成ddl语句时才有作用,并不会在运行时校验数据。防止数据重复添加,要么在数据库上建立唯一索引(数据库保证),要么在插入时提前校验(人为保证)。当然,多数情况下是两者结合。

5.      org.hibernate.hql.ast.QuerySyntaxException

Ø         持久类写错了,要不就是写成了数据库表名

Ø         hibernate3.0不支持select中嵌套查询,据说from中也不行,只支持where中嵌套查询,好像3.1支持了select中嵌套

Ø         sql语句中字段是用了保留关键字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值