Hibernate之基本配置测试用例

来源:互联网 发布:中国f1车队知乎 编辑:程序博客网 时间:2024/05/20 04:48

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.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file hibernate.log ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=springmvcoa.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.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, stdoutlog4j.logger.org.hibernate=infolog4j.logger.org.hibernate=debuglog4j.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();//取得sessionSession 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 = newDate(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()) {//关闭sessionsession.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的实例算是完成了。



0 0
原创粉丝点击