Hibernate 4.3.11快速入门案例

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时少导了个包导致出现奇怪的异常,下面这些包几乎都是必备的:
lib.JPG

映射文件: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();

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值