天天看点

Spring+Hibernate

·                                 MyEclipse Spring Hibernate整合开发

MyEclipse Spring Hibernate整合具体步骤:

1、新建一个项目工程名为:HibernateSpringProject

2、添加对Spring的支持MyEclipse-﹥Add Spring Capabilities...

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

MyEclipse Spring Hibernate整合图1

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

3添加Hibernate支持,然后选择MyEclipse-﹥Add Hibernate Capabilities...

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

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

第三步提示你是创建一个新的hibernate配置文件还是使用已有的配置文件,由于我们刚才已经生成了Spring配置文件,并且要在其中进行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开发时目录的建议结构。

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

按照下图所示进行设置

MyEclipse Spring Hibernate整合图2

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

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

1.            ﹤property name="mappingResources"﹥  

2.             ﹤list﹥  

3.              ﹤value﹥com/simon/model/User.hbm.xml﹤/value﹥  

4.              ﹤/list﹥  

5.            ﹤/property﹥ 

此时在观察类结构:

MyEclipse Spring Hibernate整合图3

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

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

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

6.            import org.springframework.context.ApplicationContext;  

7.            import org.springframework.context.support.ClassPathXmlApplicationContext;  

8.            import com.simon.model.UserDAO;  

9.            import com.simon.model.User;  

10.        public class TestWithoutTx {  

11.         

12.          

15.         public static void main(String[] args) {  

16.          // TODO Auto-generated method stub  

17.                User user=new User();  

18.                user.setFirstName("first name");  

19.                user.setLastName("last name");  

20.                user.setUsername("user name");  

21.                user.setPassword("password");  

22.                user.setDateCreated(new Long(111111));  

23.                ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");  

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

25.                userdao.save(user);   

26.         }  

27.        } 

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

如下:

1.            ﹤bean id="myTransactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager"﹥        
2.            ﹤property name="sessionFactory"﹥        
3.            ﹤ref bean="sessionFactory" /﹥        
4.            ﹤/property﹥        
5.            ﹤/bean﹥        

继续增加如下配置信息:

1.            ﹤bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"﹥        
2.              ﹤property name="proxyTargetClass"﹥        
3.               ﹤value﹥true﹤/value﹥        
4.              ﹤/property﹥        
5.              ﹤property name="transactionManager"﹥        
6.               ﹤ref bean="myTransactionManager" /﹥        
7.              ﹤/property﹥        
8.              ﹤property name="target"﹥        
9.               ﹤ref local="UserDAO" /﹥        
10.          ﹤/property﹥        
11.          ﹤property name="transactionAttributes"﹥        
12.           ﹤props﹥        
13.            ﹤!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 --﹥        
14.            ﹤prop key="*"﹥PROPAGATION_REQUIRED﹤/prop﹥        
15.           ﹤/props﹥        
16.          ﹤/property﹥        
17.         ﹤/bean﹥       

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

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

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

换成

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

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

MyEclipse Spring Hibernate整合开发就向你介绍到这里,那么你是不是对MyEclipse Spring Hibernate整合有了一些了解了呢?

 会遇到下面问题:

class"org.apache.commons.dbcp.BasicDataSource"not found出错的解决办法2009-03-25 16:19方法1:在项目上右击build path—>configure build path..—>add library..—>MyEclipse Libraries选中Spring 2.0 Persistence JDBC libraries,同时可能会用到Spring 2.0 Persistence CORE libraries所以系统自动选上了,点击finish就可以了!!!

方法2:使用MyEclipse整合Struts+Spring+Hibernate时,在“applicationContext.xml”中提示class"org.apache.commons.dbcp.BasicDataSource"not found。

到http://commons.apache.org/dbcp/downloads.html下载jar包加入lib即可.

推荐自己已经有的包,或者下载(我下载的,然后备用)。