Hibernate 4.3.11快速入门案例
最近学习Hibernate的时候,教程是以Hibernate3为背景讲的,由于教程比较老,但是又讲的很好,反正原理的东西相通,就决定自己选Hibernate4为实践。
在抽取工具类的时候,遇到一系列问题,因为获取SessionFactory的方法发生了一些变化,并且按照官方文档中的示例居然也获取不到SessionFactory。所以自己在网上找了很久解决方案。
我的环境:JDK8 + Hibernate4.3.11 + c3p0 + MySQL,经过测试所有功能均使用正常。
但是无法排除下面这个错误:
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
下面是一个完整的Hibernate4.3.11的工具类,配置文档,映射文档的信息。
导包列表
我在配置c3p0时少导了个包导致出现奇怪的异常,下面这些包几乎都是必备的:
映射文件:user.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.lim.user.domain">
<class name="User" table="user">
<!-- 配置唯一标识 -->
<id name="userID" column="userID">
<generator class="native"></generator>
</id>
<!-- 配置属性映射 -->
<property name="username" column="username" type="java.lang.String" length="30"/>
<property name="logonname" column="logonname" type="java.lang.String" length="30"/>
<property name="logonpassword" column="logonpassword" type="java.lang.String" length="30"/>
<property name="sex" column="sex" type="java.lang.String" length="10"/>
<property name="telephone" column="telephone" type="java.lang.String" length="20"/>
</class>
</hibernate-mapping>
核心配置文件:Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置数据库连接的基本信息: -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql:///javaee_hibernate
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置Hibernate方言,用于针对不同数据库生成不同底层SQL语句 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 显示SQL -->
<property name="show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 关闭事物自动提交 -->
<property name="hibernate.connection.autocommit">false</property>
<!-- hbm:映射 to DDL -->
<!-- update:如果数据库中没有表,创建一个新的表,如果有,直接使用这个表,并可以更新表的结构。 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- C3P0连接池设定-->
<!-- 使用c3po连接池 配置连接池提供的供应商-->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间-->
<!--以秒为单位,如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
<mapping resource="cn/lim/hibernate4/demo/user.hbm.xml" />
</session-factory>
</hibernate-configuration>
Hibernate工具类:HibernateUtil.java
package cn.lim.hibernate4.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
// 1.Hiberante框架加载核心配置文件(有数据库连接信息)
public static Configuration configuration;
public static SessionFactory sessionFactory;
public static ServiceRegistry serviceRegistry;
// 使用静态代码块初始化类 - 加载核心配置文件以及创建一个sessionFactory
static{
configuration = new Configuration().configure();
serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
public static Session openSession(){
return sessionFactory.openSession();
}
}
功能测试,增删改查
package cn.lim.hibernate4.demo;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.lim.hibernate4.utils.HibernateUtil;
import cn.lim.user.domain.User;
public class HibernateTest {
@Test
// 添加记录操作
public void test1() {
// 创建一个持久化对象
User user = new User();
user.setUsername("超级管理员");
user.setLogonname("admin");
user.setLogonpassword("123");
user.setTelephone("110");
user.setRemark("这是超级管理员帐号");
// 获取一个session
Session session = HibernateUtil.openSession();
// 创建一个事务
Transaction tx = session.beginTransaction();
// 操作:把user存入数据库
session.save(user);
// 事物提交
tx.commit();
// 释放资源
session.close();
}
@Test
// 查询操作
public void test2() {
// 获取session
Session session = HibernateUtil.openSession();
// 获取事务
Transaction tx = session.beginTransaction();
// 查询操作-get方法
User user1 = (User) session.get(User.class, 2);
// 查询操作-load方法
User user2 = (User) session.load(User.class, 1);
System.out.println("user1: " + user1);
System.out.println("user2: " + user2);
// 事务提交
tx.commit();
// 释放资源
session.close();
}
@Test
// 修改记录
public void test3() {
// 获取session
Session session = HibernateUtil.openSession();
// 获取事务
Transaction tx = session.beginTransaction();
// 操作:修改数据
User user = new User();
user.setUserID(1);
user.setUsername("张三");
session.update(user);
// 事务提交
tx.commit();
// 释放资源
session.close();
}
@Test
// 删除记录
public void test4() {
// 获取session和事务
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
// 操作:删除第一条记录 - 自动方式(先查询再删除)
User user = (User) session.get(User.class, 1);
session.delete(user);
// 事务提交,释放资源
tx.commit();
session.close();
}
}