欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate学习------01

程序员文章站 2022-06-13 20:22:26
...

前言

今晚看了一些Hinernate的入门视频,顺便照着敲了一边入门程序,其中遇到了一些问题,便记录在此,欢迎借鉴学习或给予指教

以下配置demo以hibernate-5.2.12.Final版本为例

如需下载此版本,下载链接在此 点击打开链接


一.基本配置

1.导入必要jar文件

也就是hibernate中的hibernate-release-5.2.12.Final/lib/required下的所有jar包

Hibernate学习------01


2.编写Hibernate配置文件(hibernate.cfg.xml)

使用MyEclipse新建一个xml(Basic Templates) 文件,点击next选择下图这个DTD ,以便代码提示

Hibernate学习------01

配置文件(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>
	<!-- 配置datasource 连接信息-->
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="connection.url">
		jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=utf-8
	</property>
	<property name="connection.username">root</property>
	<property name="connection.password">1234</property>
    <!--设置方言-->
   <property name="hibernate.dialect">
   		org.hibernate.dialect.MySQL5InnoDBDialect
   </property>

	<!-- 根据映射关系自动生成数据表 -->
	<property name="hbm2ddl.auto">create</property>
	<!-- 在控制台显示SQL -->
	<property name="show_sql">true</property>
	<property name="format_sql">true</property>

	<!-- 指定映射文件路径 -->
	<mapping resource="day01/user.hbm.xml" />
</session-factory>
</hibernate-configuration>

这里有几点需要注意的:

上面代码 设置方言处 ,因为:

我第一次运行报错,错误信息如下

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=InnoDB' at line 7

结果查询最终得知
(1)某些版本的mysql不支持type写法。
(2)实际上,在MySQL5.0以前,type=InnoDB是有效的SQL语句,MySQL5.0之后,type=InnoDB不再有效了。

解决方法即是:
修改hibernate.cfg.xml中的dialect属性,将

<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>      修改为

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

3.编写Hibernate映射文件(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 package="day01.entity">
	<!-- 配置映射关系,java类与表进行映射 -->
	<class name="User" table="t_user">
		<!-- 将列和属性进行映射 -->
		<!-- id用来配置主键列,name指类中的属性,column指表中的列 -->
		<id name="id" column="id">
			<!-- 指定主键生成策略 -->
			<generator class="native"></generator>
		</id>
		<property name="username" column="name"></property>
		<property name="passwd" column="passwd"></property>
		<property name="age" column="age"></property>
	</class>
</hibernate-mapping>

4.编写测试类


编写测试了时,有需要注意的地方,我之前遇到一个错误,如下


org.hibernate.MappingException: Unknown entity

刚开始以为时映射文件配置有问题,然后,最终发现时hibernate版本问题,如果你使用的是5.X版本的,则java代码应该如我下面

所写的那样配置注册sessionFactory


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
import org.junit.Before;
import org.junit.Test;

import day01.entity.User;

public class Test01_HelloWorld {
	  private SessionFactory sessionFactory;
	  private Session session;
	  private Transaction transaction;

	 @Before
	    public void init() {
	        //创建服务注册对象
	        ServiceRegistry serviceRegistry = 
	        		new StandardServiceRegistryBuilder().configure().build();
	        //创建会话工厂对象
	        sessionFactory = 
	        		new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
	        //会话对象
	        session = sessionFactory.openSession();
	        //开启事务
	        transaction = session.beginTransaction();
	    }

	    @Test
	    public void testSaveStudents() {
	        try{
	        	session.save(new User(null, "Allan", "123456", 12));
		        transaction.commit();
	        }catch(Exception e){
	        	transaction.rollback();
	        }finally{
	        	session.close();
		        sessionFactory.close();
	        }
	    }
}
这样就可以完美运行这个helloworld小demo了