spring下的hibernate的集成遇到的多个问题

在郁闷了很久之后,
在拜读了很多大作之后,
终于在spring下基本会使用hibernate。

另外,发个感叹:
在中国的论坛上活跃着一批,也许是一大批,所谓的高手与专家。
印象比较深刻的是javaeye。
有个帖子,回帖人不去回答问题,而是去批评发贴人,
比如:你不会先google啊,你提问不能怎样怎样啊。
当我从网上的链接一个个链接过去的时候,看到这些自以为事的人,我真的想砍人。
我想,他们在论坛上存在的意义不是与其他人交流,而是以一种高高再上的姿态对待一大批有求者。

反关国外的论坛,发贴人都很积极讨论问题,以问题讨论,知识交流为主。

这,难道又是国内学术氛围不如国外的一个例子。


正题:
我主要想做的事情是:利用spring对hibernate的支持,以dao方式与db交互。
主要用到HibernateDaoSupport和HibernateTemplate。
根据文档的论述,HibernateTemplate和HibernateDaoSupport帮助客户代码完成税代码,用户不用操心session,transaction的问题,比如像db写数据,直接是
getHibernateTemplate().save(transientInstance);
具体原理见:
http://blog.youkuaiyun.com/yethyeth/archive/2007/05/31/1633297.aspx
http://blog.youkuaiyun.com/yethyeth/archive/2007/05/30/1630292.aspx

最后,得到的代码是这样的:(DAO方式)

public  Post findById( java.lang.Short id)  {
       log.debug(
"getting Post instance with id: " + id);
       
try {
            Post instance 
= (Post) getHibernateTemplate()
                   .get(
"Post", id);
           
return instance;
        }
 catch (RuntimeException re) {
            log.error(
"get failed", re);
            
throw re;
        }

    }


 
public   void  save(Post transientInstance)  {
        log.debug(
"saving Post instance");
        
try {
            getHibernateTemplate().save(transientInstance);
            log.debug(
"save successful");
        }
 catch (RuntimeException re) {
            log.error(
"save failed", re);
            
throw re;
        }

    }
.......



问题是
getHibernateTemplate().get之类能很好工作。
但是getHibernateTemplate().save不能工作,即数据不能保存到db。
原因似乎因为在默认情况下,没有使用transaction,而保存数据要使用transaction(why)。

因此,解决的方式就是加入事务的控制,但是又不想以代码的形式,而是利用spring提供 的配置方案来控制。
这个配置就涉及到spring的事务控制部分(spring又两种事务控制方式:声明式(配置文件),编程式)。

配置文件是我的第一个问题。



1带事务管理的配置文件

下面是我的一个配置applicationContext.xml:

该文件的详细解释见http://blog.youkuaiyun.com/yethyeth/archive/2007/06/06/1641176.aspx

另,上面给出的连接有个图精辟地阐述了IoC和非Ioc的对比。

 

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >

< beans >
    
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method
="close">
        
<property name="driverClassName">
        
<value>com.mysql.jdbc.Driver</value>
        
</property>
        
<property name="url">
        
<value>jdbc:mysql://localhost/bighai</value>
        
</property>
        
<property name="username">
        
<value>bighai</value>
        
</property>
        
<property name="password">
        
<value>yaya</value>
        
</property>
    
</bean>


    
<bean id="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        
<property name="mappingResources">
            
<list>
                
<value>com/bighai/hotpost/Post.hbm.xml</value>
            
</list>
        
</property>
        
<property name="hibernateProperties">
            
<props>
                
<prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                
</prop>
                
<prop key="hibernate.show_sql">true</prop>
            
</props>
        
</property>
        
<property name="dataSource">
            
<ref bean="dataSource"/>
        
</property>
    
</bean>

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

    
< bean  id ="newPostSearchEngineTarget"  class ="com.bighai.hotpost.NewPostServiceImpl" >
        
< property  name ="postDAO" >
            
< ref  bean ="postDAO" />
        
</ property >
    
</ bean >

    
< bean  id ="newPostSearchEngineService"  class ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
        
< property  name ="transactionManager" >
            
< ref  bean ="myTransactionManager" />
        
</ property >
        
< property  name ="target" >
            
< ref  bean ="newPostSearchEngineTarget" />
        
</ property >
        
< property  name ="transactionAttributes" >
            
< props >
                
< prop  key ="insert*" > PROPAGATION_REQUIRED </ prop >
                  
< prop  key ="delete*" > PROPAGATION_REQUIRED </ prop >
                  
< prop  key ="find*" > PROPAGATION_REQUIRED,readOnly </ prop >
            
</ props >
        
</ property >
    
</ bean >

    
< bean  id ="postDAO"  class ="com.bighai.hotpost.PostDAO" >
        
< property  name ="sessionFactory" >
            
< ref  bean ="sessionFactory" />
        
</ property >
    
</ bean >
    
</ beans >

注意黑体部分,包括

数据库连接信息和

sessionFactory

两部分(主要是sessionFactory,数据库连接信息datasource是sessionFactory的一个属性)

因为最初没有这样设置,而犯了很大的错误。

我使用myecilpse,在利用myeclipse的spring的功能部分的时候,自动生成了一个applicationContext.xml版本,

其中黑体部分对应为:

 

< bean  id ="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        
< property  name ="configLocation" >
            
< value > file:src/hibernate.cfg.xml </ value >
        
</ property >
    
</ bean >

因为,我先加入了hibernate。

按照我的理解这里从applicationContext.xml连接到了hibernate.cfg.xml,而hibernate.cfg.xml中配置了数据库连接信息,如下:

 

<? xml version='1.0' encoding='UTF-8' ?>
<! DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!--  Generated by MyEclipse Hibernate Tools.                    -->
< hibernate-configuration >

< session-factory >
    
< property  name ="connection.username" > bighai </ property >
    
< property  name ="connection.url" >
        jdbc:mysql://localhost:3306/bighai
    
</ property >
    
< property  name ="dialect" >
        org.hibernate.dialect.MySQLDialect
    
</ property >
    
< property  name ="myeclipse.connection.profile" > mysql </ property >
    
< property  name ="connection.password" > yaya </ property >
    
< property  name ="connection.driver_class" >
        com.mysql.jdbc.Driver
    
</ property >
    
< mapping  resource ="com/bighai/hotpost/Post.hbm.xml"   />

</ session-factory >

</ hibernate-configuration >

因此,当出现问题,不能保存数据到db的时候,我没有想到是这里的问题。

虽然现在改了过来,但是还是不清楚为什么?

 

第二个问题是DAO模式的使用

2 正确且在spring下合理使用DAO

正确指dao模式要符合公认的方式,

合理指在spring下使用的时候有些附加的特性。

用两个图来表示我前后两种使用方式。

错误的方式:

 

改后:

 


 

(未完)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值