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的实例算是完成了。
- Hibernate之基本配置测试用例
- Hibernate系列之基本配置
- Hibernate入门(一)之基本配置
- Hibernate 基本配置
- hibernate的基本配置
- Hibernate 的基本配置
- hibernate基本配置
- Spring+hibernate基本配置
- SpringMVC+Hibernate基本配置
- hibernate的基本配置
- Hibernate基本配置
- Hibernate基本配置
- hibernate 基本配置
- hibernate-1-基本配置
- hibernate基本配置
- Hibernate基本配置
- hibernate基本配置
- Hibernate基本配置
- Deep Learning & Machine Learning
- bzoj 2442: [Usaco2011 Open]修剪草坪 单调队列优化dp
- 关于解决安装ubuntu双系统中出现的不能识别磁盘分区、空闲空间变不可用问题
- 简单的waitpid函数的使用。
- virtualenv安装tensorflow
- Hibernate之基本配置测试用例
- Android Studio的侧滑Demo
- 勿以浮沙筑高台
- 旋转的风车—利用css3新属性
- JDK1.5--)很重要的特性——泛型
- http协议学习
- 算法总结(一) 算法分析
- Java基础 (==和equals)
- 小朋友排队