`

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

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

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

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

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


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

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

publicPostfindById(java.lang.Shortid)...{
log.debug(
"gettingPostinstancewithid:"+id);
try...{
Postinstance
=(Post)getHibernateTemplate()
.get(
"Post",id);
returninstance;
}
catch(RuntimeExceptionre)...{
log.error(
"getfailed",re);
throwre;
}

}


publicvoidsave(PosttransientInstance)...{
log.debug(
"savingPostinstance");
try...{
getHibernateTemplate().save(transientInstance);
log.debug(
"savesuccessful");
}
catch(RuntimeExceptionre)...{
log.error(
"savefailed",re);
throwre;
}

}
.......



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

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

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



1带事务管理的配置文件

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

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

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

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">

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


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

<beanid="myTransactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager">
<propertyname="sessionFactory">
<reflocal="sessionFactory"/>
</property>
</bean>

<beanid="newPostSearchEngineTarget"class="com.bighai.hotpost.NewPostServiceImpl">
<propertyname="postDAO">
<refbean="postDAO"/>
</property>
</bean>

<beanid="newPostSearchEngineService"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<propertyname="transactionManager">
<refbean="myTransactionManager"/>
</property>
<propertyname="target">
<refbean="newPostSearchEngineTarget"/>
</property>
<propertyname="transactionAttributes">
<props>
<propkey="insert*">PROPAGATION_REQUIRED</prop>
<propkey="delete*">PROPAGATION_REQUIRED</prop>
<propkey="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

<beanid="postDAO"class="com.bighai.hotpost.PostDAO">
<propertyname="sessionFactory">
<refbean="sessionFactory"/>
</property>
</bean>
</beans>

注意黑体部分,包括

数据库连接信息和

sessionFactory

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

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

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

其中黑体部分对应为:

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

因为,我先加入了hibernate。

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

<?xmlversion='1.0'encoding='UTF-8'?>
<!DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!--GeneratedbyMyEclipseHibernateTools.-->
<hibernate-configuration>

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

</session-factory>

</hibernate-configuration>

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

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

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

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

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

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

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

错误的方式:

改后:


<oval id="_x0000_s1027" style="MARGIN-TOP: 3pt; Z-INDEX: 2; LEFT: 0px; MARGIN-LEFT: 402.75pt; WIDTH: 97.5pt; POSITION: absolute; HEIGHT: 148.5pt; TEXT-ALIGN: left" strokecolor="blue" filled="f"></oval><shape id="_x0000_i1025" style="WIDTH: 626.25pt; HEIGHT: 227.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/yeth/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata></shape>

(未完)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics