您的位置:首页 > 其它

Hibernate之基本配置测试用例

2016-11-23 21:36 417 查看
hibernate5.2.5入门实例

前几天不知道怎么下的一个Hibernate版本是hibernate-search-5.5.4.Final-dist,hibernate核心文件为hibernate-core-5.0.9.Final.jar,有点坑。今天在公司下载的最新版为:hibernate-release-5.2.5.Final

先开始进行配置:

1.在src下创建hibernate.cfg.xml<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>
<!-- 数据库配置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test_hibernate?useSSL=true</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<!-- 数据库方言根据选用的数据库及版本在hibernate-core.jar的org.hibernate.dialect下对应,
高版本数据库可以选低版本数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL57InnoDBDialect</property>
<property name="show_sql">true</property><!-- 输出sql语句 -->
<property name="format_sql">true</property><!-- 格式化输出sql语句 -->
<property name="hbm2ddl.auto">update</property><!-- 自动创建|更新|验证数据库表结构 -->

<mapping resource="com/ack/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

hbm2ddl.auto(有四个值):

create :每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。

create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。

update :最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。

validate :启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新。

更多hibernate的配置暂且先不讲。

2.User.java

package com.ack.hibernate;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{
private static final long serialVersionUID = -1886375452969338912L;

private int id;
private String userName;
private String loginName;
private String loginPassword;
private Date birthday;
private float salary;
private String gender;
private String status;

public User(){
}
//getter setter方法省略,自己在eclipse或myeclipse右键Source-Generate Getters and Setters...就加上了
}

如果你在考虑,实体类的数据类型是用基本数据类型好,还是包装类好,请参考:http://www.cnblogs.com/rocky-AGE-24/p/5944278.html

3.表结构:

DROP TABLE t_user;
CREATE TABLE t_user (
id int(10) primary key auto_increment,
user_name varchar(10),
login_name varchar(20),
login_password varchar(20),
birthday date,
salary float(7,2),
gender char(2),
status char(2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

USE test_hibernate;
insert into t_user values(1,'陈三','chensan','123','1992-02-29','200','1','1');
-- 测试建表正常,可操作数据

4.User.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<!-- 指定对应的实体类,对应的数据库表 -->
<class name="com.ack.sys.entity.User" table="t_user">
<!-- 主键及主键生成策略 -->
<id name="id">
<generator class="identity"/>
</id>

<!-- 配置实体类属性对应的数据库表列,如果数据库表列名与实体类属性不同则需要用column指定列名 -->
<property name="userName" column="user_name"/>
<property name="loginName" column="login_name"/>
<property name="loginPassword" column="login_password"/>
<property name="birthday"/>
<property name="salary"/>
<property name="gender"/>
<property name="status"/>
</class>
</hibernate-mapping>

在hibernate.cfg.xml中加入此实体类映射文件的mapping;

主键生成策略参考:主键生成策略讲解

5.加log4j日志(非必须,与hibernate无关,只是用来输出日志;这里是个简单的配置,后期会补上一篇自己之前整理过的log4j日志设置)

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=springmvcoa.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug
log4j.logger.com.ack=debug

6.HibernateTest.java

package com.ack.hibernate;

import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class HibernateTest {

public static void main(String[] args) {
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();

//取得session
Session session = null;
try {
session = sessionFactory.openSession();
//开启事务
session.beginTransaction();
User user = new User();
//user.setId(1);
user.setUserName("陈三");
user.setLoginName("chensan");
user.setLoginPassword("123");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date birthday = new Date(df.parse("1992-02-29").getTime());
user.setBirthday(birthday);
user.setSalary(200);
user.setGender("1");
user.setStatus("1");

//保存User对象
session.save(user);
//提交事务
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally {
if (session != null) {
if (session.isOpen()) {
//关闭session
session.close();
}
}
}
}
}


下面就是添加hibernate支持的jar包了,假设我们不知道要加哪些jar包,一步步根据错误提示来加JAR包;

首先hibernate的核心包hibernate-core.jar和mysql的jar包必须加。

这里用到hibernate-release-5.2.5.Final版本,加入hibernate-core-5.2.5.Final.jar

加入mysql-connector-java-5.1.40-bin.jar

直接运行HibernateTest.java文件中右键鼠标 Run As/Java Application

报错:Unsupported major.minor version 52.0 error

原因是JDK的解析器stanford parser与JDK版本不匹配。参考:http://blog.csdn.net/pipisorry/article/details/42965435解决。

我这里需要对应JDK1.8,装一个就好了。

它们的对应关系为:

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

MyEclipse6.5支持高版本的jdk需要另外配置,在Windows->Preferences->Java->Installed JREs添加jre8。

报错:java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger

添加jboss-logging-3.3.0.Final.jar

报错:java.lang.NoClassDefFoundError: org/dom4j/io/STAXEventReader

添加dom4j-1.6.1.jar

报错:java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ClassLoaderDelegate

添加hibernate-commons-annotations-5.0.1.Final.jar

报错:java.lang.ClassNotFoundException: javax.persistence.SharedCacheMode

加入hibernate-jpa-2.1-api-1.0.0.Final.jar

报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ‘root@xxx’' to database 'test_hibernate'

未授权xxx用户操作表的权限:

grant all privileges on *.* to root@'xxx';
flush privileges;

实际使用中根据实际情况来授权,不过开发环境给最大权限就好了,省得麻烦。

继续运行。

报错:java.lang.ClassNotFoundException: com.fasterxml.classmate.TypeResolver

类型无法解析,加入classmate-1.3.0.jar

报错:java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map;

在hibernate-core-5.2.5.Final.jar根本找不到这方法。搞到这里就崩溃了,半天一直没解决。网上找不到答案,还有说是spring和hibernate一直的某个问题;也有网上什么hibernate5.2.4的实例,说是只要hibernate的require文件夹下的jar包,也按照他的实例来测试过,还是这个问题,因为hibernate-core.jar里就没有那个方法。

晚上回来,想了想之前按照hibernate-search-5.5.4里jar包配置的实例没问题。只是原来的版本太低,要换hibernate5.2出了一系列的鬼问题。将所有原来的jar包提到hibernate5.2.5对应版本。后来按报错信息,加了classmate-1.3.0.jar,实例成功运行。

最终JAR包:



junit和log4j的jar包不是必须的。

最后

向数据库插入了一条语句:



到此hibernate5.2.5的实例算是完成了。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate5.2.5实例