我的应用程序是spring,struts2和hibernateand数据库是postgress 9.2。问题是DAO方法没有使用flush提交数据。
我的spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="dao" />
<jee:jndi-lookup id="depo" jndi-name="java:/depo"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="depo"/>
<property name="hibernateProperties">
<props>
<!-- <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> -->
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.format_sql">true</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>model.AtOrganisation</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="orgdao" class="dao.OrganisationDaoImp">
<property name="sessionfactory" ref="sessionFactory" />
</bean>
<bean id="empAction" class="action.OraganisationAction">
<property name="orgdao" ref="orgdao" />
</bean>
我的DAO课程是:
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void addOrg(AtOrganisation org) {
Session session = sessionfactory.openSession();
session.saveOrUpdate(org);
//session.flush();
}
任何人都可以指出我在这里错过了什么。 注意:如果我取消注释flush()数据将提交。
答案 0 :(得分:3)
您实际上需要通过调用:
来检索Spring正在使用的相同会话Session session = sessionFactory.getCurrentSession();
对openSession()
的调用将创建一个全新的会话,该会话不由Spring管理,而不是调用getCurrentSession()
,该@Transactional
检索由{{1}}管理的同一会话机构。
答案 1 :(得分:-1)
首先在服务级别使用@Transactional注释进行annotate方法,并保留没有Transactional注释的DAO。然后让我们看看它是如何工作的。