分享
 
 
 

整合struts和hibernate开发向导

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在用struts进行项目开发的时候,你是用什么来持久化你的数据的呢?(OJB、Castor还是hibernate?)如果没有,我建议你看看我这篇文章,Hibernate是目前开发员普遍都很推崇的ORM,而且自带的文档极其丰富(我为什么没有选择OJB,恐怕这是主要的原因。)

Struts在今年的下半年初推出了它的1.1正式版,标志其在成熟和稳定方面有了更一步的提高。本文正是基于此版本,本来想把struts1.1中的好的特性都用到做一个比较好的例子,由于时间的原因,譬如:tiles,exception hadling,validator,多模块、国际化等等在例子中没有涉及,相关内容请看我在csdn的专栏文章。

(一)前期准备:

a. struts1.1

http://jakarta.apache.org/struts

b. hibernate 2.0

http://hibernate.bluemars.net/

c. eclipse2.1(呵呵,我比较喜欢的一个IDE,此为可选)

http://www.eclipse.org/

d. ant1.5.1

http://ant.apache.org/

e. jdk1.4

f. tomcat4.1

(相关网站都可以得到其最新版本)

(二)用例说明

很简单的一个例子,关系也不复杂:猫科(Animal.java)和猫(Cat.java)。 前者对后者是一对多的关系,后者对前者是多对一的关系。

第一部分,和hibernate 相关

1. Animal类

package com.iplateau.test.hibernate.persistence;

import java.util.Set;

/**

* Class or Interface Discription

* @author $Author:jack$

* @version $ReVision:1.0 $ <br/>

* $Id:Animal.java 2003-8-4 16:44:02 jack Exp.

*/

public class Animal {

private String id;

private String name;

private Set cats;

public Animal() {

}

/**

* @return

*/

public Set getCats() {

return cats;

}

/**

* @return

*/

public String getId() {

return id;

}

/**

* @return

*/

public String getName() {

return name;

}

/**

* @param set

*/

public void setCats(Set set) {

cats = set;

}

/**

* @param string

*/

public void setId(String string) {

id = string;

}

/**

* @param string

*/

public void setName(String string) {

name = string;

}

}

Cat类:

package com.iplateau.test.hibernate.persistence;

/**

* Class or Interface Discription

* @author $Author:jack$

* @version $ReVision:1.0 $ <br/>

* $Id:Cat.java 2003-8-3 14:33:11 jack Exp.

*/

public class Cat {

private String id;

private String name;

private String sex;

private float weight;

//select name form Cat as cat where cat.name=

private Animal animal;

public Cat() {

}

/**

* @return

*/

public String getId() {

return id;

}

/**

* @return

*/

public String getName() {

return name;

}

/**

* @return

*/

public String getSex() {

return sex;

}

/**

* @return

*/

public float getWeight() {

return weight;

}

/**

* @param string

*/

public void setId(String string) {

id = string;

}

/**

* @param string

*/

public void setName(String string) {

name = string;

}

/**

* @param c

*/

public void setSex(String c) {

sex = c;

}

/**

* @param f

*/

public void setWeight(float f) {

weight = f;

}

/**

* @return

*/

public Animal getAnimal() {

return animal;

}

/**

* @param animal

*/

public void setAnimal(Animal animal) {

this.animal = animal;

}

}

这两个类的代码可以在本文后边的代码包中找到,我之所以在此列出来的原因,想让大家知道,可持久化的类和平常你熟悉的java类对象没有什么不同:属性、get、set方法。

"透明"就"透明"在这里了吧。

Hibernate为每一个可持久的类配备一个xml格式的mapping文件,他们可以通过hibernate自带的或其他的工具生成(反过来也一样:先有mapping文件,然后生成java代码),刚开始学习的时候最好用手写来熟悉。

Animal.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.iplateau.test.hibernate.persistence.Animal" table="ANIMAL">

<!-- A 32 hex character is our surrogate key. It's automatically

generated by Hibernate with the UUID pattern. -->

<id name="id" type="string" unsaved-value="null" >

<column name="ANIMAL_ID" sql-type="char(32)" not-null="true"/>

<generator class="uuid.hex"/>

</id>

<!-- A cat has to have a name, but it shouldn' be too long. -->

<property name="name">

<column name="NAME" sql-type="varchar(16)" not-null="true"/>

</property>

<set name="cats" cascade="all" inverse="true" lazy="true">

<key column="ANIMAL_ID"/>

<one-to-many class="com.iplateau.test.hibernate.persistence.Cat"/>

</set>

</class>

</hibernate-mapping>

Cat.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.iplateau.test.hibernate.persistence.Cat" table="CAT">

<!-- A 32 hex character is our surrogate key. It's automatically

generated by Hibernate with the UUID pattern. -->

<id name="id" type="string" unsaved-value="null" >

<column name="CAT_ID" sql-type="char(32)" not-null="true"/>

<generator class="uuid.hex"/>

</id>

<!-- A cat has to have a name, but it shouldn' be too long. -->

<property name="name">

<column name="NAME" sql-type="varchar(16)" not-null="true"/>

</property>

<property name="sex"/>

<property name="weight"/>

<many-to-one name="animal" class="com.iplateau.test.hibernate.persistence.Animal" column="ANIMAL_ID"/>

</class>

</hibernate-mapping>

具体mapping文件的格式以及词法(仔细看还是满简单的),请参照hibernate自带的文档,绝对详细!

好了,通常在完成mapping文件以后,就可以利用hibernate自带的工具生成建表语句,这时要用到ant来帮助你完成。{见附代码包中build.xml},以下为建表片断:

……

……

<target name="initdb.postgres"

description="Generates the database schema for Mssql server."

depends="compile">

<pathconvert refid="hibernate.mapping.files"

property="hibernate.mappings" pathsep=" "/>

<java classname="net.sf.hibernate.tool.hbm2ddl.SchemaExport" fork="true">

<!-- Hibernate Properties -->

<jvmarg value="-Dhibernate.dialect=${db.dialect}"/>

<jvmarg value="-Dhibernate.connection.driver_class=${db.driver}"/>

<jvmarg value="-Dhibernate.connection.url=${db.url}"/>

<jvmarg value="-Dhibernate.connection.username=${db.user}"/>

<jvmarg value="-Dhibernate.connection.password=${db.password}"/>

<classpath refid="project.class.path" />

<arg line="${hibernate.args}"/>

<arg line="${hibernate.mappings}"/>

</java>

</target>

……

……

第二部分,整合struts,运行实例

在第一部分,我们用hibernate对我们的数据对象进行持久化,那么hibernate如何操纵我们的数据的呢?,粗略的说就是创建系统SessionFactory(通常只创建一次),然后实例一个Session,通常我们直接对数据进行操作都是通过Session来完成,它就象jdo中的persistenceManager,而SessionFactory呢,就象jdo的persistenceManagerFactory。两者之间的关系不管是jdo还是hibernate都是相同的。

下面说一下SessionFactory的创建方法,大概有三种方法(详细请看hibernate的手册):通过*.class;通过*.hbm.xml;通过hibernate.cfg.xml;我比较倾向于用最后一种方法,本例就是采用hibernate.cfg.xml来创建SessionFactory以及数据库连接的。

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="hibernate.connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>

<property name="hibernate.connection.url">jdbc:microsoft:sqlserver://yourserver;DatabaseName=yourdatabase;SelectMethod=Cursor</property>

<property name="hibernate.connection.username">your account</property>

<property name="hibernate.connection.password">your password</property>

<property name="hibernate.connection.pool.size">20</property>

<property name="hibernate.dialect">net.sf.hibernate.dialect.SybaseDialect</property>

<!-- Mapping files -->

<mapping resource="com/iplateau/test/hibernate/persistence/Cat.hbm.xml"/>

<mapping resource="com/iplateau/test/hibernate/persistence/Animal.hbm.xml"/>

</session-factory>

</hibernate-configuration>

OK,确定了创建方法以后我们就可以应用了,应为SessionFactory通常只创建一次,所以推荐在系统初始化的建立,那么可以利用struts的plugin机制来完成这一任务,见:

Com.iplateau.test.hibernate.InitHibernateDataStore.java

(hibernate手册也推荐在struts中用这种方法创建)

关于struts的扩展机制请参见我的另一篇文章《扩展你的struts》

package com.iplateau.test.hibernate;

import java.io.File;

import java.util.List;

import java.net.URL;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import net.sf.hibernate.SessionFactory;

import net.sf.hibernate.cfg.Configuration;

import javax.servlet.ServletException;

import org.apache.struts.action.ActionServlet;

import org.apache.struts.action.PlugIn;

import org.apache.struts.config.ModuleConfig;

/**

* Class or Interface Discription

* @author $Author:jack$

* @version $ReVision:1.0 $ <br/>

* $Id:InitHibernateDataStore.java 2003-8-3 14:08:50 jack Exp.

*/

public class InitHibernateDataStore implements PlugIn {

private String _configFilePath = "/hibernate.cfg.xml";

private SessionFactory _factory = null;

static String contextFactory =

"com.sun.jndi.rmi.registry.RegistryContextFactory";

private Context ctx = null;

/* (non-Javadoc)

* @see org.apache.struts.action.PlugIn#destroy()

*/

public void destroy() {

// TODO Auto-generated method stub

try {

if (ctx != null) {

ctx.close();

ctx = null;

}

} catch (NamingException ex) {

ex.printStackTrace();

}

}

/* (non-Javadoc)

* @see org.apache.struts.action.PlugIn#init(org.apache.struts.action.ActionServlet, org.apache.struts.config.ModuleConfig)

*/

public void init(ActionServlet arg0, ModuleConfig arg1)

throws ServletException {

// TODO Auto-generated method stub

Configuration configuration = null;

URL configFileURL = null;

System.out.println("4385738758237482173841847382374823742");

try {

configFileURL =

InitHibernateDataStore.class.getResource(_configFilePath);

configuration = (new Configuration()).configure(configFileURL);

_factory = configuration.buildSessionFactory();

Context ctx = new InitialContext();

ctx.addToEnvironment(

javax.naming.Context.INITIAL_CONTEXT_FACTORY,

contextFactory);

ctx.bind("hibernate_connection_factory", _factory);

} catch (Exception e) {

}

}

}

在创建sessionFactory以后,采用jndi来取得:

SessionFactory sf =

(SessionFactory) inttex.lookup("hibernate_connection_factory");

{见com.iplateau.test.hibernate.DBManager.java}

数据库的中文问题,我采用filter来解决,效果还不错,具体参看web.xml以及com.iplateau.test.hibernate.SetEncodingFilter.java

小节:

总的来说,把struts和hibernate这两种在业内比较推崇的开源技术相结合,在项目开发中不管是从效率上还是易维护上都是完美的结合。

希望从这个简单的例子中给你更多的提示,同时也希望你提出好的建议,通过plateau_t@sina.com和我联系。

附上代码包:

http://www.ifreeway.com.cn/download/strutsInHibernate.rar

(两星期内有效,过后可能会删除)

参考资源:

hibernate参考手册(hibernate发布包中自带)

hibernate example

http://sourceforge.net/project/showfiles.php?group_id=40712

Introduction to hibernate

http://www.theserverside.com/resources/article.jsp?l=Hibernate

同时http://www.chinaxp.orghttp://www.jdon.com都有很多关于hibernate的讨论。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有