posts - 57, comments - 4, trackbacks - 0, articles - 10
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

在Hibernate中配置Oracle数据库方法

Posted on 2009-05-27 10:04 hanwei 阅读(4438) 评论(0)  编辑  收藏

Oracle相关配置参数 
我在Oracle中建立了一个单独的用户:HD,设置其密码为:abc。为该用户分配好相应的数据库空间, 细致的配置方法和信息不再多说,总之你需要得到类似下面的信息以备开发时所使用: 

机器地址:hdibm(因为是在本机还可以使用localhost和127.0.0.1,如果是另一台机器使用该机器的IP地址) 
oracle的侦听端口:1521 
数据库实例名:hdorc 
访问用户名:hd 
访问密码:abc 
需 要注意的是要给HD用户分配至少Connect的角色。另外在他所使用的表空间中分配足够或是无限制的限额大小,否则在开发时都会遇到问题。 除这些之外 还需要你从安装的Oracle或Oracle网站上下载最新的JDBC包,它有两个包,其中一个是与JDK相关的驱动,另一个是多语言支持包(这里我们不 使用OCI的驱动,使用Thin的驱动)。 因为我使用的JDK为1.4所以驱动包我使用了 ojdbc14.jar ,JDK1.4使用的多语言支持包与JDK1.2相同都是 nls_charset12.jar 。 

在数据库中我们建立一些表以用于程序开发,以一个简单的用户管理为例我们先建立一个简单的用户表(sysuser): 

表名:sysuser 
用户ID:userid(vchar:32) 
用户名:username(vchar:20) 
用户密码:userpasword(vchar:20) 
用户最后登录时间:lastlogin(date) 
你也可以使用这个sql语句来创建表: 
CREATE TABLE "HD"."SYSUSER" ("USERID" VARCHAR2(32) NOT NULL, 
    "USERNAME" VARCHAR2(20) NOT NULL, "USERPASWORD" VARCHAR2(20) 
    NOT NULL, "LASTLOGIN" DATE, PRIMARY KEY("USERID"), 
    UNIQUE("USERNAME"))  
    TABLESPACE "USERS" 

驱动名称:Oracle Thin Driver 
驱动程序包名:浏览选择你的ojdbc14.jar文件 
驱动程序类:oracle.jdbc.driver.OracleDriver 
驱 动程序前 缀:jdbc:oracle:thin: < username >; @ < password >; // < server >; [: < 1521 >; ] / < database_name >; (这 里是最新的驱动的URL书写方法,具体的最好看一下相关Oracle驱动的有关URL的说明) 
配置好驱动程序后我们来增加一个数据库连接: 

 
这里: 

数据库连接名:HDTestDB 
驱动名称:Oracle Thin Driver(就是在上面我们建立的) 
驱动程序类:oracle.jdbc.driver.OracleDriver 
数据库连接:jdb c:oracle:thin:hd@abc//hdibm:1521/hdorc 
用户名:hd 
密码:abc 

将之前准备好的Oracle驱动包也加入到Web项目中。主要是这两个文件: 

nls_charset12.jar 
ojdbc14.jar 

配置Hibernate的配置文件 
配置Hibernate数据库连接配置 
数据库的连接配置很简单,在项目的 src目录 下建立一个xml文件,名为 hibernate.cfg.xml 。这个文件的内容为: 

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

<hibernate-configuration>

    <session-factory>

        <property name="dialect">net.sf.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="connection.username">hd</property>
        <property name="connection.password">abc</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:hdorc</property>
        
<property name="connection.pool.size">1</property>
<property name="statement_cache.size">25</property>
<property name="jdbc.fetch_size">50</property>
<property name="jdbc.batch_size">30</property>

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

        <!-- Mapping files -->
        <mapping resource="com/huangdong/demo/dao/SysUser.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

我们对这里的各个property元素一一说明: 

dialect:使用了Oracle9的对照 
connection.driver_class:Oracle的JDBC驱动类名 
connection.username:Oracle数据库访问用户名 
connection.password:Oracle数据库访问密码 
connection.url:Oracle数据库访问URL 
connection.pool.size:数据库连接池大小 
statement_cache.size:JDBC statement缓冲大小 
jdbc.fetch_size:设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数 
jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 
show_sql:设定是否在控制台上显示向数据库提交的SQL语句,在开发调试时比较有用 

下面是在com.huangdong.demo.dao包中生成SysUser类和SysUser.hb.xml文件。 

由于在Java中使用java.util.Date有很多不方便的地方,所以我将lastlogin的映射后的java属性改为了calendar。 

这是修改后的SysUser.hbm.xml文件: 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.huangdong.demo.dao.SysUser" table="SYSUSER">
<id column="userid" length="32" name="userid" type="string">
<generator class="uuid.hex"/>
</id>
<property column="username" length="20" name="username" not-null="true" type="string" unique="true"/>
<property column="userpasword" length="20" name="userpasword" not-null="true" type="string"/>
<property column="lastlogin" length="7" name="lastlogin" type="calendar"/>
</class>
</hibernate-mapping>
这是修改后的SysUser.java文件: 

package com.huangdong.demo.dao;

import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

/** @author Hibernate CodeGenerator */
public class SysUser implements Serializable {

    /** identifier field */
    private String userid;

    /** persistent field */
    private String username;

    /** persistent field */
    private String userpasword;

    /** nullable persistent field */
    private java.util.Calendar lastlogin;

    /** full constructor */
    public SysUser(java.lang.String username, java.lang.String userpasword, java.util.Calendar lastlogin) {
        this.username = username;
        this.userpasword = userpasword;
        this.lastlogin = lastlogin;
    }

    /** default constructor */
    public SysUser() {
    }

    /** minimal constructor */
    public SysUser(java.lang.String username, java.lang.String userpasword) {
        this.username = username;
        this.userpasword = userpasword;
    }

    public java.lang.String getUserid() {
        return this.userid;
    }

public void setUserid(java.lang.String userid) {
this.userid = userid;
}

    public java.lang.String getUsername() {
        return this.username;
    }

public void setUsername(java.lang.String username) {
this.username = username;
}

    public java.lang.String getUserpasword() {
        return this.userpasword;
    }

public void setUserpasword(java.lang.String userpasword) {
this.userpasword = userpasword;
}

    public java.util.Calendar getLastlogin() {
        return this.lastlogin;
    }

public void setLastlogin(java.util.Calendar lastlogin) {
this.lastlogin = lastlogin;
}

    public String toString() {
        return new ToStringBuilder(this)
            .append("userid", getUserid())
            .toString();
    }

    public boolean equals(Object other) {
        if ( !(other instanceof SysUser) ) return false;
        SysUser castOther = (SysUser) other;
        return new EqualsBuilder()
            .append(this.getUserid(), castOther.getUserid())
            .isEquals();
    }

    public int hashCode() {
        return new HashCodeBuilder()
            .append(getUserid())
            .toHashCode();
    }

}

编写数据库连接获取类 
我们编写一个单独的类,用于从SessionFactory中获取数据库连接session。这个类名为HibernateUtil,我们将其放于com.huangdong.demo.util包中,具体的代码如下: 

package com.huangdong.demo.util;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
try {
sessionFactory =
new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException(
"Exception building SessionFactory: " + ex.getMessage(),
ex);
}
}

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}

public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}

我们为该类加入一个向数据库中增加数据的方法: 

public boolean TestAdd() {
try {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
SysUser user = new SysUser();
user.setUsername("丫丫");
user.setUserpasword("uhkuhkqepdwqi");
user.setLastlogin(Calendar.getInstance());
session.save(user);
tx.commit();
HibernateUtil.closeSession();
} catch (HibernateException e) {
e.printStackTrace();
return false;
}
return true;
}

只有注册用户登录后才能发表评论。


网站导航: