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
如果你在考虑,实体类的数据类型是用基本数据类型好,还是包装类好,请参考:http://www.cnblogs.com/rocky-AGE-24/p/5944278.html
3.表结构:
4.User.hbm.xml
在hibernate.cfg.xml中加入此实体类映射文件的mapping;
主键生成策略参考:主键生成策略讲解
5.加log4j日志(非必须,与hibernate无关,只是用来输出日志;这里是个简单的配置,后期会补上一篇自己之前整理过的log4j日志设置)
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,装一个就好了。
它们的对应关系为:
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用户操作表的权限:
实际使用中根据实际情况来授权,不过开发环境给最大权限就好了,省得麻烦。
继续运行。
报错: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的实例算是完成了。
前几天不知道怎么下的一个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的实例算是完成了。
相关文章推荐
- 软件测试用例的基本要素
- Hibernate 学习笔记-1-3(Hibernate的基本映射以及几种主键生成策略的测试)
- Hibernate Search基本配置和使用
- 如何设计基本路径覆盖测试用例
- 测试用例设计白皮书--测试用例基本概念
- 测试用例设计白皮书--测试用例基本概念
- 软件测试配置管理的四个基本活动
- 测试用例的基本格式
- Mysql测试三:Mysql + DRBD + Heartbeat(v1)基本配置笔记及切换测试
- 配置Struts+Hibernate+Spring基本步骤
- Hibernate3.0连接DB2 9.0配置测试
- hibernate 基本配置和使用
- 测试用例设计白皮书--测试用例基本概念
- hibernate 的一些基本配置以及解释
- Google C++ Test Framework (二)为用例中的测试进行统一的配置
- 测试用例设计白皮书--测试用例基本概念
- JMS---Apache ActiveMQ的配置测试用例
- 配置spring+hibernate基本框架时的一些低级错误(网摘)
- 测试用例管理系统TestLink的安装与配置
- 最简单的SSH(Struts+Spring+Hibernate)[三]配置文件和测试页面