错误记录(一)hibernate小测试

本文介绍使用 Hibernate 3 版本时遇到的问题及解决方案,包括正确的配置方式和事务管理方法,确保数据的一致性和事务的正确提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用hibernate3版本。注释的形式


测试类的代码

package test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

import entity.Users;

public class HibernateTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AnnotationConfiguration configuration = new AnnotationConfiguration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		Transaction tx = session.beginTransaction();
        Users user=new Users();
        user.setName("wang");
        user.setPassword("123");

		// Student student=(Student) session.get(Student.class, 1);
		//
		// System.out.println(student.getUsername());
        session.save(user);
		tx.commit();
		if ( session.isOpen()) {  
		     
			session.close();
		}  

	}

}

错误一:刚开始使用的configuration

Configuration configuration = new Configuration().configure();

报错如下:

Exception in thread "main" org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping class="entity.Users"/>
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1648)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1603)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1582)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1556)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1476)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1462)
at test.HibernateTest.main(HibernateTest.java:18)

后configuration改正为AnnotationConfiguration configuration = new AnnotationConfiguration().configure();

  同时将包改为import org.hibernate.cfg.AnnotationConfiguration;


错误2:开始直接tx.commit;

                            session.colse;

       抛出异常异常: Session was already closed.

 据说= =错误原因是这样子的:

    tx.commit()里具体做了什么? 

    这得先看org.hibernate.Transaction接口都有哪些实现类, 例子中又是用的哪个实现类的commit方法. 不难发现Transaction接口有如下实现类: 
    debug跟到t.commit()代码里,发现是调用的JDBCTransaction实现类的方法. 一番找寻后终于在finally里看到了closeIfRequired方法,很是可疑!名字都起的那么"此地无银三百两". 
  一番跟踪这后,在transactionContext.managedClose 方法里找到了"犯罪现场": close()! 原来已经调用此方法给关掉了!

引用来自http://rmn190.iteye.com/blog/370864

耶!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值