176142998

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks
在网上漫无边际地搜索了一天,绝大部分都是垃圾信息,只好自己做一遍

    好了,下面我就将我所完成的例子程序完整的叙述,希望对读者有所帮助。

一、开发环境

   myeclipse6.01GA,mysql。

二、表结构

   CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `username` varchar(64) NOT NULL,
  `password` varchar(64) NOT NULL,
  `first_name` varchar(128) NOT NULL,
  `last_name` varchar(128) NOT NULL,
  `date_created` bigint(20) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

三、具体步骤:

1、在myeclipse中建立一个“java project”,工程名为:HibernateSpringProject,这个程序用java应用程序就可以实现。

 

2、右键点击工程文件,然后选择MyEclipse->Add Spring Capabilities...

第一步选择需要加载的包,如下图所示:



其余的选项默认,点击 “下一步”,提示是否建立spring配置文件,选择默认,然后直接点击“finish”。

3、右键点击工程文件,然后选择MyEclipse->Add Hibernate Capabilities...

第一步选择默认,点击“下一步”。

第二步提示你是用hibernate的配置文件还是用spring的配置文件进行SessionFactory的配置,选择使用spring来对hibernate进行管理,这样最后生成的工程里就不包含hibernate.cfg.xml了,好处是在一个地方就可以对hibernate进行管理了。

 

第三步提示你是创建一个新的hibernate配置文件还是使用已有的配置文件,由于我们刚才已经生成了spring配置文件,并且要在其中进行hibernate的配置,所以选择复选框“Existing Spring configuration file”,选择该项后,下方的“Spring Config:”后的下拉列表框自动填入了刚才生成的spring配置文件路径。这时候有个错误,要求你填写SessionFactory ID,这个id就是我们要为hibernate注入的一个类的ID,随便取一个名字,例如“sessionFactory”。点击“下一步”。

 

第四步要求选择数据库连接信息,这个步骤可以参照网上的信息进行配置,很简单。这里需要注意一点,“bean id”处填写一个数据源的名称,例如“datasource”,下面的单选按钮选择“Use Jdbc Driver”就行了,此处没有用jndi。在“DB Driver”处选择配置好的数据库连接信息,其他信息自动填入余下的输入框中,点击下一步。

 

第四步提示是否创建“SessionFactory”类,由于本程序用spring替我们注入sessionfactory,此处可以不用创建,勾掉复选框。然后直接点击“finish”。

 

4、建立三个包,分别是com.simon.dao,com.simon.model,com.simon.service。

在用ssh开发web应用时,需要对生成的各个类文件进行组织,下面就对一个可行的目录方案进行介绍:

譬如应用中有一个用户管理模块,则在公共包下建立一个user包,如该公共包可以为com.simon.oa,

在user包下包括如下子包

1、controler包

该包放置各种struts的action。

 

2、dao包

该包放置各类dao(data access object),也就是放置对数据库访问的实现类,在用myeclipse中的“Hibernate Reverse Engineering”进行反向操作时在某一个目录中就会生成对应某个表的DAO,生成后可将该DAO拖到dao包中。在某些应用中将DAO作为接口,在该接口中包括所有对数据库的操作方法,然后在dao包建立一个hibernate包,在hibernate包中放置对DAO接口的实现,譬如:UserDAO接口有一个实现类为UserDaoImpl,将该类放置到hibernate包中,实际的开发倾向于后一种方式,因为对这个DAO接口可以实现spring的IoC操作。(不知道myeclipse对此是怎么考虑的,这个问题让我纠缠了很久,误将DAO理解成一个能够进行实际操作的类,而不是一个接口,以后开发要注意)

 

3、model包

该包中放置hibernate反向工程生成的bean和该bean对应的.hbm.xml文件。

 

4、service包

该包放置业务操作类,譬如用户服务类,一般情况将该用户操作类提取一个接口,然后在service包下生成一个impl包,在impl包中才放置用户操作接口的实现类。该用户接口实现类中调用DAO接口对数据库进行操作,而调用该实现类的方法在struts的action中。

 

5、vo包(value object)

vo包中的中包括struts中使用的POJO及actionform等信息。

VO:  Value Object
DTO: Data Transfer Object
个人理解VO和DTO是类似的东西,原则上VO和DTO只有Public Fields,主要用于进程之间数据传递的问题,VO和DTO不会传递到表示层,在业务层就会被吸收。但看到很多人在建立VO和DTO时,也含有Setter,Getter属性和一些其它的辅助方法,这也无可厚非,我自己也不能确定这对不对。

实际的结构如下:


 

5、打开myeclipse的database exployer perspective,右键选择user表,选择Hibernate reverse engineering

按照下图所示进行设置


点击下一步,在“ID generator”中选择native,如果愿意可以直接点击finish

这时再观察applicationContext.xml文件,发现在sessionFactory定义中增加了如下代码:

  <property name="mappingResources">
   <list>
    <value>com/simon/model/User.hbm.xml</value>
    </list>
  </property>

此时在观察类结构:


在model包下生成了三个类和一个映射文件。AbstractUser是User的抽象类,在此需要说明一点的是,在标准的spring应用中UserDAO应该是一个接口,而不是一个具体的类,而myeclipse将数据库操作方法直接写到了UserDAO中,另外,按照标准写法,DAO实现类要实现DAO接口,并且要包括SessionFactory的变量声明,但是生成的代码中UserDAO直接实现了HibernateDaoSupport类,需要特别注意。所以,如果你需要标准写法,可以将UserDAO中的方法提取出来,只保留方法声明,然后再间一个impl目录,将该DAO的实现类放在该impl中,按照管理将该类命名为UserDAOImpl,另外一点最好将DAO和它的实现类移到dao包中,结构和model包中的相同

在这个例子中暂且将生成的文件都放到model中。

此时我们可以写一个测试程序将一条记录插入到user表中,当然这个测试程序并没有用事务控制,后面我们还会介绍,测试程序如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.simon.model.UserDAO;
import com.simon.model.User;
public class TestWithoutTx {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
        User user=new User();
        user.setFirstName("first name");
        user.setLastName("last name");
        user.setUsername("user name");
        user.setPassword("password");
        user.setDateCreated(new Long(111111));
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDAO userdao=(UserDAO)context.getBean("UserDAO");
        userdao.save(user);       
 }
}

现在的问题是增加事务处理功能,跟我继续,这时候源程序不需要修改,只需要修改applicationContext.xml配置文件,首先增加事务管理器,因为事务管理器也需要使用数据库,所以需要引入sessionFactory

如下:

 <bean id="myTransactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 <property name="sessionFactory">
 <ref bean="sessionFactory" />
 </property>
 </bean> 

继续增加如下配置信息:

<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="proxyTargetClass">
   <value>true</value>
  </property>

  <property name="transactionManager">
   <ref bean="myTransactionManager" />
  </property>
  <property name="target">
   <ref local="UserDAO" />
  </property>
  <property name="transactionAttributes">
   <props>
    <!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
    <prop key="*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>

 

注意以上红色部分:  注意这个属性,必须为 true, 使用CGLIB时才不用强制编写DAO接口,也就是由于myeclipse并没有为我们生成DAO接口,而是生成了一个数据库实现类,为了使spring不强迫我们必须定义一个DAO接口,只需要将这个proxyTargetClass属性定义为true,这点非常重要,程序出错很有可能和这个属性设置错误有关。

下面再写一个测试程序,和上面的测试程序基本相同,唯一不同是将上面的

UserDAO userdao=(UserDAO)context.getBean("userDAO");

换成

UserDAO userdao=(UserDAO)context.getBean("userDAOProxy");

执行,一切ok,数据正确的插入到数据库中。

posted on 2008-06-13 16:40 飞飞 阅读(308) 评论(0)  编辑  收藏

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


网站导航: