该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-11-25
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操作,而我没有截图,所以表达也许不够清晰,请谅解。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-11-26
为什么还要配置JNDI呢?
在hibernate.property文件中不是已经配置好用户名和密码了吗? |
|
返回顶楼 | |
发表时间:2003-11-26
hiberante文档中说明了,首先优先选择AppServer的数据库连接池,其次选择DBCP,最后才考虑Hibernate自带的连接池。
它的properties文件中配置的是自带的连接池,而我的例子中采用的是WAS的连接池,因此需要配置JNDI。 |
|
返回顶楼 | |
发表时间: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。不过我推测应该配置是一样的。 选择建什么项目,其实多建几次,就会发现怎么建都是殊途同归。 |
|
返回顶楼 | |
发表时间:2003-12-01
不好意思,我没有用过。:)
你可以自己试试:) |
|
返回顶楼 | |
发表时间:2003-12-05
没有:(
|
|
返回顶楼 | |
发表时间:2003-12-06
打开web.xml-用部署描述方式打开。
下面有很多标签可选择,比如 概述,Servlet,过滤器,。。引用 。。 选择 引用,然后在选择资源 。。。 |
|
返回顶楼 | |
发表时间: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。不过这都不会出现在我们的代码中。 |
|
返回顶楼 | |
发表时间: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? 是的。 |
|
返回顶楼 | |
发表时间:2003-12-08
roberto 写道 hiberante文档中说明了,首先优先选择AppServer的数据库连接池,其次选择DBCP,最后才考虑Hibernate自带的连接池。
它的properties文件中配置的是自带的连接池,而我的例子中采用的是WAS的连接池,因此需要配置JNDI。 如果用app server自带的连接池,程序代码是不是有变化?是不是就不用hibernate.session,而是改用java.sql.datasource了? |
|
返回顶楼 | |