日期:2014-05-16  浏览次数:20382 次

HibernateTemplate().save(entity)为什么不容永久到数据库
        我今天在做ssh(structs and spring and hiernate)项目时,进行整合的时候在输入数据并用Hibernate().save(entity)方法
插入一条数据并永久到数据库时却不容永久化,死心,出了问题,但是程序并没有出错,
左思右想,搞了半天才知道什么原因:
  解决方法:
        可以在sava方法后面加一句
[color=red]
getHibernateTemplate().getSessionFactory().openSession().beginTransaction();
[/color]
      就可以了,
     
      不过这个方法不是很好,我想引起这个原因:


问题在于事务的配置不对,事务应该配置在业务层而不是持久层,配在持久层的方法上就没有意义了
持久层配置文件:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="SessionFactory" />
</property>
</bean>
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="cha*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="WorkerDAO" class="hibernateDaoImpl.WorkerDAOImpl">
<property name="sessionFactory">
<ref bean="SessionFactory" />
</property>
</bean>
业务层配置:
<bean id="WorkerLoginCheck" parent="baseTransactionProxy">
<property name="target">
<ref local="WorkerLoginCheckTarget" />
</property>
</bean>
<bean id="WorkerLoginCheckTarget" class="serviceImpl.WorkerLoginCheckImpl">
<property name="workerDAO">
<ref bean="WorkerDAO" />
</property>
</bean>
实现方法:
serviceImpl.WorkerLoginCheckImpl中有chaWorker方法,调用WorkerDAO的insertOne方法

也许对各位有用,


1 楼 laiseeme 2008-02-26  
你应该没加事务吧
getHibernateTemplate().getSessionFactory().openSession().beginTransaction(); 
这么写也够麻烦的
你查查文档看看声明式事务 对代码的入侵小些
2 楼 movingboy 2008-02-26  
牢骚一句:
看到不少网友的帖子里给出的Spring的声明式事务控制的风格仍是Spring 1.2风格的,这种风格比较烦琐,且有一些限制。为什么不用Spring 2.x的声明风格呢?只要查一下Spring 2.x的联机手册就可以找到的