从网上学着用Hibernate操作数据库:
通过Hibernate可以简化对数据库的操作,本节首先创建一个HibernateUtil类,用于管理session,然后介绍如何通过Hibernate实现数据库的查询、插入、删除和更新操作。
SessionFactory用来创建Session实例,通过Configuration实例构建SessionFactory。Configuration实例根据当前的配置信息,构造SessionFactory实例并返回。一旦SessionFactory构造完毕,即被赋予特定的配置信息。
Session是持久层操作的基础,相当于JDBC的Connection。通过SessionFactory实例构建。Session实例提供的saveOrUpdate、delete和createQuery方法分别实现了数据库的插入更新、删除和查询操作,简化了数据库的基本操作。
先给出代码,再做具体分析:
package com.wjy.hiboperation;
import java.io.File;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static{
try{
File file=new File("./file/hibernate.cfg.xml");
sessionFactory=new Configuration().configure(file).buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
分别来看看基本操作:
增和改:
//取得SessionFactory实例
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
//打开一个Session实例
Session session = sessionFactory.openSession();
//开始事务
Transaction tx = session.beginTransaction();
//创建UserTable类实例
UserTable userTable=new UserTable();
//设置userName属性 userTable.setUserName("张三");
//设置password属性
userTable.setPassword("123456");
//设置power属性
userTable.setPower("图书管理员");
//插入和更新数据库
session.saveOrUpdate(userTable);
//提交事务
tx.commit();
//关闭会话
session.close();
删:
//取得SessionFactory实例
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
//打开一个Session实例
Session session = sessionFactory.openSession();
//开始事务
Transaction tx = session.beginTransaction();
//创建UserTable类实例
UserTable userTable=new UserTable();
//设置userName属性 userTable.setUserName("张三");
//设置password属性
userTable.setPassword("123456");
//设置power属性
userTable.setPower("图书管理员");
// 删除操作
// session.delete(userTable);
//提交事务
tx.commit();
//关闭会话
session.close();
查询:
//取得SessionFactory实例
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
//打开一个Session实例
Session session = sessionFactory.openSession();
//开始事务
Transaction tx = session.beginTransaction();
// 查询hql语句
String hql = "from UserTable where UserName='张三' and Password='123456'";
//执行查询,查询结果为Query实例Query userList = session.createQuery(hql);
//将查询结果放到一个list中
List list = userList.list();
//提交事务
tx.commit(); // 这里好像不用commit因为是查询操作,list都获得了还提交什么。
//关闭session
session.close();
//**********************************************************************************************************************************
好了,到了这里,我试着操作上一篇博客中提到的数据库看看,结果发生了很多问题。
问题分析:
1,jar包不够,要将网上下的hibernate的完整包中的provider和required文件夹中的jar包建立依赖。
2,
Exception in thread "main" org.hibernate.MappingException: Unknown entity: XXXXXxxxxx
解决办法:
需要在hibernate.cfg.xml中加入
例如:
<mapping class="com.wjy.models.Dogstable" resource="com/wjy/models/Dogstable.hbm.xml"/>
3,
关于org.hibernate.service.jndi.JndiException: Error parsing JNDI name [foo]
解决办法:
其实问题出在hibernate.cfg.xml中
在<session-factory name="">
</session-factory>
中多了一个name属性,把name属性删除了,就不会报异常了。即将name=""删掉即可。
4,
org.hibernate.StaleStateException: Unexpected row count: 0 expected: 1
解决办法:
使用的是hibernate的saveOrUpdate方法保存实例。saveOrUpdate方法要求ID为null时才执行SAVE,在其它情况下执行UPDATE。在保存实例的时候是新增,但你的ID不为null,所以使用的是UPDATE,但是数据库里没有主键相关的值,所以出现异常。
5,
Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: XXXxxx is not mapped
原因就是:Hibernate中的HQL查询是基于持久化类查询的,而不是基于数据库表查询的。我的数据库表名是XXX,而我的数据库的表所对应的持久化类的名为xxx。所以在hql语句中,String hql = "from xxx where id=10";xxx可以到hibernate.cfg.xml文件中查到映射的表名称。
我写的用Hibernate操作MySQL数据库的例子见附件。