zoukankan      html  css  js  c++  java
  • Hibernate开发环境的简单搭建及常见错误(一)

    勿以恶小而为之,勿以善小而不为--------------------------刘备

    劝诸君,多行善事积福报,莫作恶

    上一章简单介绍了Struts2配置异常错误处理(十六),如果没有看过,请观看上一章

    一 Hibernate简单介绍

    一.一 Hibernate框架的作用

    Hibernate是数据库层框架,做持久化操作。 以前所讲的Struts2是Web层框架。

    Hibernate 是全自动的ORM框架,可以代替我们自动生成SQL语句,完成基本的CRUD操作。

    想一想,我们在SE阶段 自己写 JDBC,是不是很麻烦啊. Hibernate 就是帮我们简化 JDBC操作的。

    一.二 Hibernate的下载地址

    官方下载地址是: http://hibernate.org/orm/releases/5.2/

    下载完成后的目录结构是:

    在这里插入图片描述]

    其中documentataion表示的是开发文档,在里面有一个javadocs/index.html 文件,这是文档首页,点击进去之后,可以方便的查看Hibernate官方给出的API.

    lib文件夹,存储的是关于Hibernate开发中,经常用到的Jar包。

    有一个required文件夹,表示必须的。开发中,将required文件夹下的所有Jar包全部复制到项目工程中去。 一共是10个。

    在这里插入图片描述

    与C3P0整合的Jar包在liboptionalc3p0文件夹下。(C3P0连接池)

    与EhCache整合的Jar包在liboptionalehcache文件夹下。(Cache缓存)

    Project文件夹为Hibernate所给的一些事例,具体为相关Jar包的源代码。

    里面有一个etc文件夹,下面为一些常用的配置文件

    在这里插入图片描述

    一.三 ORM 对象关系映射

    ORM,指得是Object Relation Mapping 对象关系映射。 简单的来说,就是将以前对具体数据表的操作转换成对相应的实体的操作。

    如对数据表User进行相应的CRUD操作,转换成对User类JavaBean的相应的操作。

    相应的映射规则:

    将表------>映射成实体

    将视图------->映射成实体。

    将表中字段------->映射成实体的属性

    将表与表之间的外键关系,一对多,多对多,一对一关系映射成实体类之间的一对多,多对多,一对一关系。

    二. 开发环境的具体搭建

    二.一 创建项目所对应的数据库

    Hibernate只会自动创建表,不能创建数据库。所以数据库必须要自己手动创建。 利用Navicat For MySQL工具创建一个数据库,取名称为hibernate。 采用utf-8编码方式。

    在这里插入图片描述

    二.二 导入相应的Jar包(新建普通的Java项目即可)

    不要忘记导入MySQL 数据库的jar包。

    在这里插入图片描述

    二.三 创建相应的实体类

    如User 员工类

    在pojo包下,创建User.java

    package com.yjl.pojo;
    
    import java.io.Serializable;
    
    /**
     @author: 两个蝴蝶飞
     @date: 2018年9月29日 下午7:53:39
     @Description Hibernate操作时相应的实体类,实现序列化
    */
    public class User implements Serializable{
    	private static final long serialVersionUID = 1L;
    	/**
    	 * @param 主键id 用Integer包装类
    	 * @param userName 用户名
    	 * @param password 密码
    	 * @param sex 性别
    	 * @param age 年龄
    	 * @param description 相关描述
    	 */
    	private Integer id;
    	private String userName;
    	private String password;
    	private String sex;
    	private Integer age;
    	private String description;
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public Integer getAge() {
    		return age;
    	}
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    	public String getDescription() {
    		return description;
    	}
    	public void setDescription(String description) {
    		this.description = description;
    	}
    }
    
    

    二.四 创建User.hbm.xml文件

    在与实体类User同级的目录下,即也在pojo包下,创建一个配置文件.xml, 取名称为实体类.hbm.xml。

    在这里插入图片描述

    创建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="com.yjl.pojo">
    	<!-- 具体的实体类 -->
    	<class name="User" table="user">
    		<!-- 主键 -->
    		<id name="id" column="id">
                        <generator class="native"></generator>
                    </id>
    		<!-- 其余属性 -->
    		<property name="userName"></property>
    		<property name="password"></property>
    		<property name="sex" ></property>
    		<property name="age"></property>
    		<property name="description"></property>
    	</class>
    </hibernate-mapping>
    
    

    二.五 创建Hibernate框架 全局配置文件 hibernate.cfg.xml

    这个文件是Hibernate官方定义的文件,不能改名称.(与Spring整合后可以改,但也不建议改),且必须要放在src目录下,即源文件目录下。

    其中cfg指的是 config的缩写。

    在这里插入图片描述

    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://localhost:3306/hibernate?characterEncoding=utf8</property>
    		<property name="hibernate.connection.username">root</property>
    		<property name="hibernate.connection.password">abc123</property>
    		<!-- 关于Hibernate的相应配置 -->
    		<!-- 引入方言 -->
    		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    		<property name="hibernate.show_sql">true</property>
    		<property name="hibernate.hbm2ddl.auto">update</property>
    		<property name="hibernate.format_sql">true</property>
    		<!-- 引入相应的约束文件  ctrl点击时可以正确进入-->
    		<mapping resource="com/yjl/pojo/User.hbm.xml"/>
    	</session-factory>
    </hibernate-configuration>
    
    

    二.六 创建SessionFactory对象

    在service包下,创建一个基本的CreateTest类进行测试。 用Junit4进行测试。

    一定要创建到SessionFactory对象。 当出现这个对象时,才会执行自动创建表。

    package com.yjl.service;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    /**
     @author: 两个蝴蝶飞
     @date: 2018年9月29日 下午8:30:59
     @Description 测试创建User表是否成功
    */
    public class CreateTest {
    	@Test
    	public void createTest(){
    		//获取配置
    		Configuration config=new Configuration();
    		config.configure();
    		//创建sessionFactory对象,要到session这一步。
    		SessionFactory sessionFactory=config.buildSessionFactory();
                    /*上面这是Hibernate 5的写法。 如果用的是Hibernate 4的话,那么是这样,要添加服务登记*/
                    /*configuration=new Configuration();
    			configuration.configure();
    			ServiceRegistry serviceRegistry=new         StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); // 实例化服务登记
    			sessionFactory=configuration.buildSessionFactory(serviceRegistry); */
    	}
    }
    
    

    二.七 Junit启动createTest方法,进行测试

    在进行测试时,出现了两个相当大的问题。

    二.七.一 添加Log4j2.xml 日志 文件

    报的错误是:

    ERROR StatusLogger No log4j2 configuration file found.
    Using default configuration: logging only errors to the console.

    搜索网上的答案,需要创建一个log4j2.xml文件。 log4j.properties文件不好使。 将log4j.properties文件改成log4j2.properties文件也不好使。只有创建log4j2.xml文件。

    在src下,必须是src下创建一个log4j2.xml文件。内容是:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%m%n" />
            </Console>
        </Appenders>
        <Loggers>
        	<!-- 修改级别为DEBUG -->
            <Root level="DEBUG">
                <AppenderRef ref="Console" />
            </Root>
        </Loggers>
    </Configuration>
    
    

    二.七.二 报创建表时搜索引擎的问题 (楼主MySQL版本为5.5 5.1也会报这个错误。其余版本请忽略)

    将log4j2.xml文件添加成功之后,运行时,出现:

    在这里插入图片描述

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
    You have an error in your SQL syntax;
    check the manual that corresponds to your MySQL server
    version for the right syntax to use near 'type=MyISAM' at line 9

    查看了一下MySQL中my.ini中文件的引擎值,为

    在这里插入图片描述

    其实,这是与MySQL无关的。 是Hibernate自己的问题。

    在5.5和5.1版本时,MySQL创建的引擎是MyISAM。 其余版本是INNODB。 故其余版本请忽略这个问题。

    在这里插入图片描述

    问题答案出处(感谢!!!): http://jasonhan-sh-hotmail-com.iteye.com/blog/1473955

    将hibernate.cfg.xml中的

    org.hibernate.dialect.MySQLDialect

    改成:

    org.hibernate.dialect.MySQL5InnoDBDialect

    重新测试: 引擎变成了InnoDB。

    在这里插入图片描述

    表也创建成功了。

    三. Hibernate对MySQL方言的支持

    对:

    <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    

    进行ctrl+鼠标点击,进行查看:

    @Deprecated
    /*    */ public class MySQL5InnoDBDialect
    /*    */   extends MySQL5Dialect
    /*    */ {
    /*    */   protected MySQLStorageEngine getDefaultMySQLStorageEngine()
    /*    */   {
    /* 20 */     return InnoDBStorageEngine.INSTANCE;
    /*    */   }
            // }
    
    

    但是这个类MySQL5InnoDBDialect 已经过时了。

    它的那个返回值是:

    public static final MySQLStorageEngine INSTANCE = new InnoDBStorageEngine();
    

    表示创建的是InnoDB引擎。

    它继承了MySQL5Dialect。 查看MySQL5Dialect

    public class MySQL5Dialect
     extends MySQLDialect{}
    

    它继承了MySQLDialect 类。这个MySQLDialect表示是关于MySQL的方言。

    而MySQLDialect类继承了Dialect类

    public class MySQLDialect extends Dialect{}

    这个类Dialect自然就是所有数据库类的父类。

    ctrl+T, 查看Dialect类的继承结构:

    在这里插入图片描述

    里面有MySQL,有DB2,有Oracle等各个方言。

    ctrl+T, 查看MySQL5Dialect

    在这里插入图片描述

    既然MySQL5InnoDBDialect已经过时了,那么Hibernate官方肯定要给一个更好的。此时用MySQL5Dialect试试。

    org.hibernate.dialect.MySQL5Dialect

    可以运行。 以后都改成MySQL5Dialect了。 刚开始的MySQLDialect太父类了,基本没有什么功能了。

    四. 其他常见错误的演示

    四.一 没有引入mysql驱动jar包

    在这里插入图片描述

    四.二 User.hibernate.xml中的属性property没有与User类相对应

                <!-- 正确的是:<property name="userName"></property> 
    		现在改成写:username-->
    		<property name="username"></property> 
    

    在这里插入图片描述

    四.三 没有引入User.hibernate.xml文件

    这个时候,不会报错。 但不会创建user表。 因为hibernate.cfg.xml与User.hibernate.xml没有任何关系。这个问题最难发现,要多注意。

    四.四 引入了错误的User.hibernate.xml文件

                    <!-- 正确的应该是pojo包下,而不是po包下 -->
    		<mapping resource="com/yjl/po/User.hibernate.xml"/>
    

    在这里插入图片描述

    可以通过ctrl+鼠标进行点击,如何路径正确,会跳转到相应的xml文件。如果不正确,不会进行跳转。

    注意此时写的是 ///(斜杠) 文件夹的形式,并不是...(点) 包的形式。(这一点不像MyBatis) 也会报这一个not found的错误。

    Hibernate是一个非常牛的框架。建议多学习。

    谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

  • 相关阅读:
    python-configparser模块,xml.etree模块
    Ubuntu16.04环境下Vim 配置 for HTML,CSS,JAVASCRIPT(1)
    Windows 命令行及Git操作
    Ubuntu16.04 无任务栏问题
    ubuntu16.04安装中文输入法
    本地Web服务器搭建
    爬虫(1)
    Python(四):数字连珠2
    python学习(四)五数连珠
    Openjudge 百练第4109题
  • 原文地址:https://www.cnblogs.com/yjltx/p/13138942.html
Copyright © 2011-2022 走看看