您的位置:首页 > 数据库 > Oracle

一个简单的hibernate连接oracle数据库例子

2015-04-21 16:32 316 查看
转自:http://wangyj0898.blog.51cto.com/1519857/380092/ 点击打开链接

三、开发基于Hibernate的应用

现在假设我们在Oracle数据库中创建了一个表Student,它的字段如下表所示:

字段 说明

Student_ID 学员编号,整型,PK,自动增长

Student_Name 学员姓名,字符串类型

Student_Age 学员年龄,整型

如果我们在Oracle中定义这个数据库表,我们可以定义一个创建数据库表的SQL脚本如下:

create table Student(

Student_ID number(6) NOT NULL PRIMARY KEY,

Student_Name varchar2(10) NOT NULL,

Student_Age number(2) NOT NULL

);

另外,因为在Oracle中没有“自动增长”类型的字段,所以通常情况下我们需要定义一个sequence来作为自动增长类型字段的数据。在这里,我们也可以定义一个sequence来给Student_ID字段提供数据。创建sequence的SQL脚本如下:

CREATE SEQUENCE student_sequence

INCREMENT BY 1

START WITH 1000

NOMAXVALUE

NOCYCLE

CACHE 10;

我们在这里创建了一个student_sequence,准备用来作为Student_ID字段的值。

接着,我们需要一个hibernate.cfg.xml或者属性文件hibernate.properties来指定Hibernate所使用的数据库以及用户名、密码等其他相关的配置,我们在此使用xml文件,它的内容如下:

源文件:hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<!--程序执行的时候是否显示真正的sql语句-->

<property name="show_sql">true</property>

<!--使用的SQL对应的“方言”,此处是Oracle9的“方言”-->

<property name="dialect">org.hibernate.dialect.Oracle9Dialect

</property>

<!--连接数据库的Driver-->

<property name="connection.driver_class">

oracle.jdbc.driver.OracleDriver

</property>

<!--数据库连接url-->

<property name="connection.url">

jdbc:oracle:thin:@localhost:1521:nitpro

</property>

<!--用户名-->

<property name="connection.username">system</property>

<!--密码-->

<property name="connection.password">manager</property>

</session-factory>

</hibernate-configuration>

做完前面的这些准备工作后,下面就让我们进入激动人心的Hibernate编程吧!

首先,我们需要定义一个用于表示“学生”对象的Student类:

源文件:Student.java

public class Student

{

private int student_id;

private String student_name;

private int student_age;

public int getStudent_id()

{

return student_id;

}

public String getStudent_name()

{

return student_name;

}

public int getStudent_age()

{

return student_age;;

}

public void setStudent_id(int id)

{

this.student_id = id;

}

public void setStudent_name(String name)

{

this.student_name = name;

}

public void setStudent_age(int age)

{

this.student_age = age;

}

}

这个类很简单,就是一个典型的JavaBean的定义:有三个属性:student_id、student_name和student_age,分别对应数据库表Student中的三个字段,并且在这个类中定义了对应各个属性的setter/getter方法。

接下来,我们需要给这个类定义一个XML映射文件“Student.hbm.xml”,文件内容如下:

源文件:Student.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="Student" table="Student">

<id name="student_id" column="student_id" type="java.lang.Integer">

<!-- <generator class="native">

<param name="sequence">student_sequence</param>

</generator>

<generator class="assigned"> </generator> 这里是我自己加的,测试下oracle下的各种主键增长策略,

测试得出,assigned是程序输入主键,increment是hibernate生成,生成的值为nvl(max(主键),0) + 1;数据笔可以不要主键,但是

Stadent.hbm.xml中必须配置主键生成策略-->

<generator class="increment"> </generator>

</id>

<property name="student_name" column="Student_Name"

type="java.lang.String"/>

<property name="student_age" column="Student_Age"

type="java.lang.Integer"/>

</class>

</hibernate-mapping>

注意,在这个xml文件中,我们首先使用class元素定义了我们定义的Java类和数据库表之间的关系,在这里,我们定义的Java类和数据库表名称都是Student,然后,我们使用id元素定义了主键名称、类型等,它有一个子元素generator来说明主键的产生方式,此处指定的是“native”,表示根据数据库来选择,比如,对于Oracle数据库,它会去寻找一个sequence(默认情况下,它会去寻找一个名为“hibernate_sequence”的sequence),我们可以用参数param来指定一个sequence。而property用来指定Student.java类中的属性和Student数据库表之间的对应关系,以及各个字段的数据类型。在这个例子中,我们指定的数据类型是Java语言中的数据类型(此时需要指定引用类型数据),我们也可以使用Hibernate中自定义的数据类型,限于篇幅,在本文中不一一讲解。

然后,我们需要在hibernate.cfg.xml中加入这个文件的映射,可以在</session-factory>之前加入下面的语句:

<mapping resource="Student.hbm.xml"/>

最后,我们需要编写一个测试类来测试一下,能否通过Hibernate和前面我们定义的相关程序,完成对数据库的操作。我们编写一个测试类如下:

源文件:Test.java

import org.hibernate.*;

import org.hibernate.cfg.*;

public class Test

{

public static void main(String[] args)

{

try

{

//通过Configuration获得一个SessionFactory对象

SessionFactory sf

= new Configuration().configure().buildSessionFactory();

//打开一个Session

Session session = sf.openSession();

//开始一个事务

Transaction tx = session.beginTransaction();

//创建一个Student对象

Student stu = new Student();

//通过Student的setter方法改变它的属性

//注意student_id不用我们设置

stu.setStudent_name("zhangsan");

stu.setStudent_age(18);

//通过session的save()方法将Student对象保存到数据库中

session.save(stu);

//提交事务

tx.commit();

//关闭会话

session.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

编译并运行这个程序,如果前面的配置和程序都没有问题,应该可以正确的往数据库表Student中插入一条数据,并且在控制台上能够得到如下输出(只列出部分输出内容):

Hibernate: select student_sequence.nextval from dual

Hibernate: insert into Student (Student_Name, Student_Age, student_id) values (?,?,?)

可以看到,虽然我们自己没有编写SQL语句进行插入数据的操作,但是其实Hibernate还是要使用SQL语句来进行数据库的操作,只是这个过程对程序员来说是透明的。

通过这个简单的例子,相信读者对Hibernate编程已经有了初步的了解。读者可以在此基础上进行更深入的学习。

------------------------------------------------------------------------------------------------------------------------------------

根据上面的内容运行后报了一个错误(解决方案转自:http://zsw4522006.iteye.com/blog/1453805)

Hibernate Validator bean-validator-3.0-JBoss-4.0.2

Exception in thread "main" org.hibernate.HibernateException: Unable to get the default Bean Validation factory

at org.hibernate.cfg.beanvalidation.BeanValidationActivator.applyDDL(BeanValidationActivator.java:127)

at org.hibernate.cfg.Configuration.applyBeanValidationConstraintsOnDDL(Configuration.java:1674)

at org.hibernate.cfg.Configuration.applyConstraintsToDDL(Configuration.java:1624)

at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1415)

at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:972)

at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:130)

at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:92)

at com.zhang.bean.TestHibernate.testExport(TestHibernate.java:39)

at com.zhang.bean.TestHibernate.main(TestHibernate.java:19)

Caused by: java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.hibernate.cfg.beanvalidation.BeanValidationActivator.applyDDL(BeanValidationActivator.java:118)

... 8 more

Caused by: org.hibernate.HibernateException: Unable to build the default ValidatorFactory

at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:345)

at org.hibernate.cfg.beanvalidation.TypeSafeActivator.applyDDL(TypeSafeActivator.java:106)

... 13 more

查了半天的,找到改正的方法,需要在hibernate.cfg.xml中配置<property name="javax.persistence.validation.mode">none</property>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: