【学习笔记】Hibernate连接oracle数据库

一、 Hibernate介绍

    Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案。ORM方案的思想是将对象模型表示的对象映射到关系型数据库中,或者反之。Hibernate目前是ORM思想在Java中最成功、最强大的实现。它于2001年的年末发布第一个版本,立即引起了广泛的注意。2003年6月,Hibernate2发表,并且获得Jolt大奖,进而被JBoss吸纳成为它的一个子项目。2005年3月,Hibernate 3发表,其中做了一些比较重大的改进。本文以Hibernate5为基础编写。

    另外,Hibernate除了可以在J2EE容器中运行外,还可以运行在Java应用程序中。本文就是以Java应用程序为例来介绍它。

二、配置开发环境
    本文以一个Java应用程序(Java Application)为例,介绍如何使用Hibernate来进行数据库操作。
    在进行Hibernate开发之前,需要首先获得Hibernate类库、相应数据库的JDBC驱动类库。Hibernate类库可以从http://www.hibernate.org中下载。我用的Hibernate版本是5.3.2。而JDBC驱动可以根据不同的数据库来选择,在这个例子中,使用的是Oracle数据库,那么相应的JDBC驱动可以从Oracle安装目录\ora92\jdbc下获得。其他的数据库请根据相关的说明获得。

    下载Hibernate包后,可以将它解压到一个文件夹,此处假设为C:\hibernate-release-5.3.2.Final,然后将C:\hibernate-release-5.3.2.Final\lib\required下的jar包复制到项目的lib文件夹下。(一般只需要dom4j、cglig、commons-logging、commons-collections、log4j、ehcache、asm、jta、antlr这些类库就可以了)

    还需要一个Oracle驱动jar包。

    做完这些配置后,就可以在此基础上进行基于Hibernate的Java程序开发了。

三、开发基于Hibernate的应用

   这里我用的是Oracle自带的Emp表测试。

   1.首先配置一个hibernate.cfg.xml来指定Hibernate所使用的数据库以及用户名、密码等其他相关的配置,我们在此使用xml文件,它的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">


<hibernate-configuration>

    <session-factory>
    	<!-- 配置数据库的基本信息 -->
    	
    	<!--数据库连接url-->
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:gy</property>
        <!--连接数据库的Driver-->
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
         <!--用户名-->
        <property name="connection.username">scott</property>
         <!--密码-->
        <property name="connection.password">admin</property>
        <!-- 配置hibernate指定数据库的方言 -->
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        
        <!-- 配置hibernate的基本信息 -->
        
        <!-- 打印sql语句到控制台 -->
        <property name="show_sql">true</property>
        <!-- 格式化sql语句 -->
	<property name="format_sql">true</property>
	<!-- 指定自动生成数据表的策略 -->
	<property name="hbm2ddl.auto">update</property>
        <!-- 配置映射文件 -->
        <mapping resource="com/guyun/test/emp.hbm.xml"/>


    </session-factory>


</hibernate-configuration>

    2.封装一个Emp实体类

import java.util.Date;
/**
 * 员工实体类
 */
public class Emp {
	private int empno;
	private String ename;
	private String job;
	private Date hiredate;
	public Emp() {
		super();
	}
	//这里的构造器没有empno
	public Emp(String ename, String job, Date hiredate) {
		super();
		this.ename = ename;
		this.job = job;
		this.hiredate = hiredate;
	}
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", hiredate=" + hiredate + "]";
	}
	
}

3.配置emp.hbm.xml映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- name对应实体类 ,table对应数据库表名 -->
	<class name="com.guyun.entity.Emp" table="emp">
		<!-- 主键 -->
		<id name="empno" column="empno" type="int">
			<!-- 采用算法为主键自动设置值,配置之后就不用为主键设置值(配置这个之后自已设置的主键值将不采用) -->
			<generator class="increment"></generator>
		</id>
		<!-- name对应Emp.java里字段名称,column对应数据库的列名 ,type对应字段类型 -->
		<property name="ename" column="ename" type="java.lang.String"></property>
		<property name="job" column="job" type="java.lang.String"></property>
		<property name="hiredate" column="hiredate" type="java.sql.Date"></property>
	</class>
</hibernate-mapping>

4.最后编写测试类

import java.sql.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.guyun.entity.Emp;

public class EmpTest {
	public static void main(String[] args) {
		//创建一个sessionFactory对象
		SessionFactory factory = new Configuration().configure().buildSessionFactory();
		
		//创建一个session
		Session session = factory.openSession();
		
		//开启事务
		Transaction transaction = session.beginTransaction();
		
		//执行插入数据库
		Emp emp = new Emp("孤云","Boss",new Date(0));//这里不设置主键是因为在映射文件中配置了自动设置主键
		session.save(emp);
		
		//提交事务
		transaction.commit();
		
		//关闭session
		session.close();
		
		//关闭sessionFactory
		factory.close();
	}
}

最后是控制台输出的结果

Hibernate:   select  max(empno)  from emp 这是生成的主键
Hibernate:   insert   into emp (ename, job, hiredate, empno) values  (?, ?, ?, ?) 这是插入语句,最后数据库也成功插入了一条数据

在测试的过程中遇到了一个异常ServiceException,经查找发现是配置数据库url的时候把localhost写成了location,导致数据库连接不上。

附上异常信息:

ERROR: The Network Adapter could not establish the connection
Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
	at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:179)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:119)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:84)
	at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:474)
	at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
	at com.guyun.test.EmpTest.main(EmpTest.java:15)
Caused by: org.hibernate.exception.GenericJDBCException: Error calling Driver#connect
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
	at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:118)
	at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41)
	at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:363)
	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:282)
	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:260)
	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:401)
	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:112)
	at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:75)
	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:100)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
	at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
	at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
	... 14 more
Caused by: java.sql.SQLException: The Network Adapter could not establish the connection
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
	at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
	... 29 more
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
	at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:359)
	at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:422)
	at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:672)
	at oracle.net.ns.NSProtocol.connect(NSProtocol.java:237)
	at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
	... 34 more
Caused by: java.net.UnknownHostException: location
	at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
	at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
	at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
	at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
	at java.net.InetAddress.getAllByName(InetAddress.java:1192)
	at java.net.InetAddress.getAllByName(InetAddress.java:1126)
	at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:114)
	at oracle.net.nt.ConnOption.connect(ConnOption.java:123)
	at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:337)
	... 39 more
最后附上Hibernate和Oracle驱动包的下载连接:链接:https://pan.baidu.com/s/1ZC9b2r4xZGIwK_L6DYmM0A 密码:z8l6

猜你喜欢

转载自blog.csdn.net/ZY4444444/article/details/81049001