使用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
耶!