论坛首页 Java企业应用论坛

Demo - 在WSAD 5.1上使用Hibernate 2.1beta6

浏览 23823 次
该帖已经被评为精华帖
作者 正文
   发表时间:2003-11-25  
Hibernate 2.1 beta6 Demo On WSAD 5.1

Roberto Nie, Roberto_nie@163.com
December 25, 2003

Summary
本文介绍在WSAD5.1下实现一个最简单的hibernate实例。

Environment
OS: Windows XP SP1 简体中文版
MEM: 512M

Requirement:
Hibernate 2.1 beta6
Hibernate eclipse plug in 0.9.6
WSAD 5.1
DB2 8.1

Steps:
1:建立demo数据库和表:
在DB2数据库中创建demo数据库,
CREATE DATABASE DEMO;
创建表demo,
CREATE TABLE DB2ADMIN.DEMO
(ID    INTEGER         NOT NULL,
  NAME  VARCHAR(100)
)

2::建立一个新的web应用程序
点击“文件”->“新建”->“项目”,在弹出的对话框中,选择“j2ee”, 和“企业级应用程序”,点击下一步,选择“创建j2ee 1.3企业应用程序项目”,点击下一步,项目名称填写demo,点击下一步,在新弹出的对话框中选择“新建模块”,仅仅选择“web项目”,点击完成。

3:配置WAS应用服务器自带的数据库连接池。
创建服务器:
打开服务器透视图,右键点击“服务器”,选择“新建/服务器和服务器配置”,服务器名称填写“was5”,然后选择webSphere V5.0 测试环境,点击完成。
配置JNDI:
在服务器透视图中的服务器配置窗口中打开was5服务器配置,选择“安全性”标签栏,在JAAS认证中中添加认证条目,点击“添加”,然后依次填写别名(demo),用户标识(db2admin),和密码(123456),描述可以不填写。
然后选择“数据源”标签,在JDBC提供程序列表中选择“Default DB2 JDBC Provider”,然后在“在上面选择的JDBC提供的程序中定义的数据源”部分点击“添加”,将弹出“创建数据源”的对话框,选择“DB2 JDBC Provider”和“V5.0 数据源”点击“下一步”。
在这个页面中,名称栏填写“demo”,JNDI名称填写“jdbc/demo”,组件管理认证别名,和容器管理认证别名下拉选择“demo”,不用选择“在容器管理的持久性(CMP)使用该认证名”,其他的使用默认值。选择下一步。
在“资源属性”列表中,选择database name,值填写“demo”;选择“portNumber”,值填写“50000”(这是访问DB2实例的缺省端口)。点击完成。
最后保存设置页。
打开“web”透视图,编辑\webContent\WEB-INF\web.xml(注意打开方式是“部署描述符编辑器”,这样编辑比源文件方式方便)。点击“资源”标签,然后点击“添加”,引用资源的名称改为“jdbc/demo”,类型改为“java.sql.DataSource”。
保存推出。

4.装载hibernate和hibernate eclipse plugin类库
从sourceforge.net上可获取,以上两者的zip文件,我所使用的是hibernate2.1beat6和eclipse plugin 0.9.6。
将hibernate-2.1beta6.zip解压到tmp目录,将hibernate2.jar和tmp\hibernate-2.1\lib下所有的的jar文件复制到workspace_demo\demoWeb\WebContent\WEB-INF下。(或许不需要所有的,但这样省事嘛)
将hibernator-0.9.6.zip解压到WSAD安装目录下的eclipse\plugin目录下。注意,如要此插件支持最新版本的hibernate,需要将hibernate\lib下同名的jar文件和hibernate2.jar的最新版本替代wasd51\eclipse\plugins\hibernator_0.9.6\lib下的jar文件和hibernate2.jar文件。

5.编写hibernate.cfg.xml文件
hibernate可以识别xml和properies文件,据说Hibernate往后的版本将改成使用xml,因此我选择使用xml来配置hibernate。
选择web透视图,在JavaSource目录下,创建hibernate.cfg.xml。创建方法是,右键点击“JavaSource”->“新建”->“其他”->“xml”,依照向导建立一个空的文件名为hibernate.cfg.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="connection.datasource">java:comp/env/jdbc/demo</property>
        <property name="show_sql">false</property>
        <property name="use_outer_join">true</property>
        <property name="dialect">net.sf.hibernate.dialect.DB2Dialect</property>
        <!-- Mapping files -->
        <mapping resource="com/jaq/po/Demo.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
此时,你会看到保存出错,其实这个错误并不影响demo程序的正常运行,但是WSAD在保存之前检查dtd文件的存放位置,由于无法从本地获取,于是它尝试从http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd来的到,这便是你看到的operation time out错误的原因。为了去掉讨厌的红叉,可以这样做,首先将hibernate2.jar解开,从中找到hibernate-configuration-2.0.dtd和hibernate-mapping-2.0.dtd,将他们复制到一个目录下,暂定为c:\tmp。打开“窗口”菜单,选择“首选项”,在“首选项”对话框中选择“XML”->“XML目录”。点击“新建”,在“URL”input框中填写:“file:C:\tmp\hibernate-configuration-2.0.dtd”,键类型选择“公用标识”,在“键”的input框中填写“-//Hibernate/Hibernate Configuration DTD//EN”,同样的方法再添加另一个dtd的XML目录条目,URL和键分别用“file:C:\tmp\hibernate-mapping-2.0.dtd”和“-//Hibernate/Hibernate Mapping DTD//EN”。再保存一次,这下红叉叉就不见了。

6.编写Demo.java和Demo.hbm.xml。
首先建一个包为com.jaq.po,然后再在这个包下面建一个Demo的类。方法都是,右键点击“JavaSource”,然后选择“新建包”和“新建类”,并根据它的向导来创建,在这里不再赘述。现在打开Demo.java文件,添加两个field:private int id,private String name;然后在源文件处右键,选择“源”->“生成setter和getter”,让工具自动帮你生成setter和getter方法。(字段多的时候,这项功能简直帅呆了)。然后通过hibernate插件来帮你生成映射文件,首先打开“窗口”->“显示试图”->“其他”,然后你应该可以看见hibernate的选项(注意,插件安装后要重新启动WSAD,插件解压的目录不对会导致插件无法显示在这个视图中)。选择“Hibernate”->“Hibernate”,点击确定之后,你将看到自动产生的Demo.hbm.xml文件,这个自动产生的工具据说在映射复杂的情况下,表现不佳,需要较多的手工修改。保留一下部分:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
    <class name="com.jaq.po.Demo" table="demo">
        <id name="id">
            <generator class="assigned">
            </generator>
        </id>
        <property name="name"/>
    </class>
</hibernate-mapping>
<!-- parsed in 0ms -->
然后保存此映射文件(此文件自动保存在与Demo.java同目录下,程序运行时将会有一份拷贝在Demo.class同目录下)。

7.编写测试页面
右键点击“WebContent”->“新建JSP”,然后,将下面的代码复制到新建的JSP页面中。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<%@ page
language="java"
contentType="text/html; charset=GB18030"
pageEncoding="GB18030"
%>
<%@ page import= "java.sql.* "%>
<%@ page import= "com.jaq.po.* "%>
<%@ page import= "net.sf.hibernate.* "%>
<%@ page import= "net.sf.hibernate.cfg.* "%>
<META http-equiv="Content-Type" content="text/html; charset=GB18030">
<META name="GENERATOR" content="IBM WebSphere Studio">
<TITLE>demoDBCP.jsp</TITLE>
</HEAD>
<BODY>
<%
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = null;
try {
    tx = sess.beginTransaction();
    Demo demo = new Demo();
    demo.setId(1);
    demo.setName("roberto");
    sess.save(demo);
    tx.commit();
}
catch (Exception e) {
    if (tx!=null) tx.rollback();
    throw e;
}
finally {
    sess.close();
}
%>
</BODY>
</HTML>
如果找不到类的路径,可以在“项目”->“属性”中的java构建路径,中添加新的jar包,或者文件夹,我把hibernate2.jar加入到了此项目的java构建路径当中。当然也可以通过别的途径让编译器找到你需要引用的类。

7.运行
右键点击Demo.jsp文件,选择“在服务器上运行”。如果运气够好,运行完之后,你就可以从数据库的demo表中查看到你刚插入的那条记录。


=====================
由于有较多的UI操作,而我没有截图,所以表达也许不够清晰,请谅解。
   发表时间:2003-11-26  
为什么还要配置JNDI呢?
在hibernate.property文件中不是已经配置好用户名和密码了吗?
0 请登录后投票
   发表时间:2003-11-26  
hiberante文档中说明了,首先优先选择AppServer的数据库连接池,其次选择DBCP,最后才考虑Hibernate自带的连接池。

它的properties文件中配置的是自带的连接池,而我的例子中采用的是WAS的连接池,因此需要配置JNDI。
0 请登录后投票
   发表时间:2003-11-27  
cheong 写道
我都是使用WSAD 5.1 , datasource 我是使用 jt400.jar,
在JNDI 的設置 是否一樣 ?


如果我选择“创建j2ee 1.2 企业应用程序项目”,
有沒有甚麼不同 ?


我只发现有两个DataSource 类:java.sql.DataSource 和 java.activation.DataSource,都位于
was_installed_dir\runtimes\base_v5\lib\j2ee.jar 中。
没有用过你说的jt400.jar。不过我推测应该配置是一样的。

选择建什么项目,其实多建几次,就会发现怎么建都是殊途同归。
0 请登录后投票
   发表时间:2003-12-01  
不好意思,我没有用过。:)
你可以自己试试:)
0 请登录后投票
   发表时间:2003-12-05  
没有:(
0 请登录后投票
   发表时间:2003-12-06  
打开web.xml-用部署描述方式打开。
下面有很多标签可选择,比如 概述,Servlet,过滤器,。。引用 。。

选择 引用,然后在选择资源 。。。
0 请登录后投票
   发表时间:2003-12-06  
cheong 写道
請教如何設置hibernate.cfg.xml
我的hibernate.properties 如下:

hibernate.connection.driver_class = com.ibm.as400.access.AS400JDBCDriver
hibernate.connection.url = jdbc:as400://abc400
hibernate.connection.libraries = JOSLIB
hibernate.connection.username = user1
hibernate.connection.password = 123456
hibernate.dialect=net.sf.hibernate.dialect.DB2Dialect


我用wsad 5.1 , 還在wsad的server 中的datasource 配置了JNDI, 名叫jdbc/db2/dsaj400,

請問在hibernate.cfg.xml  中 connection.datasource配置甚麼 ?

<property name="connection.datasource">???</property>

如何令hibernate 使用wsad中的connection pool ?


<property name="connection.datasource">java:comp/env/jdbc/demo</property>这是JNDI引用名,与JDBC driver没关系。

我们只是得到session ->操作数据库 ->关闭session。
使用connectionpool是session干的事情,它自然会从配置文件中得到相关配置,然后通过jndi得到connection。不过这都不会出现在我们的代码中。
0 请登录后投票
   发表时间:2003-12-07  
看着你的问题,我的头越来越大。。一边擦汗,一边翻书。。。。
呵呵,开玩笑的:)别介意

按你的意思是, 設置了datasource之後, 它自動會使用在wsad中的datasource -> JNDI 得到相关配置connection pool 嗎, 是否我在wsad中設置了 JNDI , Hibernate 就會自動用了 wsad 的connection pool ? 

是的。这个东西你一式便知。

請問為甚麼要設置JAAS认证 ? 作用是甚麼 ? 

JAAS是WAS采用的认证体系结构,它有很多优点,比如你可能从很多地方来获取验证,比如去LDAP或者数据库或者其他的某个地方。JAAS的结构屏蔽认证类型,给所有的应用提供统一的认证接口。

你可以从JNDI的出现得到这个结论,为什么以前得到数据库连接不需要通过名字服务,现在要这么做?同样的理由,AppServer希望统一管理资源,数据库连接作为资源的一种,大家都通过名字服务来获取资源。

你发现了吗?作为开发者,总是觉得很多配置显得多余。但是如果从总体结构或者从Administrator的角度考虑,这些东西出现就会觉得很自然。

請問為甚麼要設置 组件管理认证别名和容器管理认证别 ? 作用是甚麼 ? 

这个不知道,好像是EJB中的CMP相关的配置巴。

設置"资源"是否叫wsad 採用jdbc/demo 這個JNDI 作連接 database? 

是的。
0 请登录后投票
   发表时间:2003-12-08  
roberto 写道
hiberante文档中说明了,首先优先选择AppServer的数据库连接池,其次选择DBCP,最后才考虑Hibernate自带的连接池。

它的properties文件中配置的是自带的连接池,而我的例子中采用的是WAS的连接池,因此需要配置JNDI。

如果用app server自带的连接池,程序代码是不是有变化?是不是就不用hibernate.session,而是改用java.sql.datasource了?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics