关于Spring整合Hibernate的问题
我执行数据库操作的时候一直报出:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
这个错误。
applicationContext.xml:
<!-- 数据库配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/test" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<!-- 会话工厂 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="show_sql">
true
</prop>
<prop key="hbm2ddl.auto">
update
</prop>
<prop key="current_session_context_class">
thread
</prop>
</props>
</property>
<!-- 配置实体描述文件 -->
<property name="mappingLocations">
<list>
<value>classpath:/com/sx/bean/*.hbm.xml</value>
</list>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置事务的传播特性 -->
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">readOnly</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
UserDao下的save方法:
public boolean save(User user) {
try
{
getHibernateTemplate().save(user);
} catch (RuntimeException e)
{
System.out.println("UserDao >> save >> " + e);
return false;
}
return true;
}
每次调用Dao方法都会报出上述那个错误,求救。。。。。
夏日还珠格格
9 years, 5 months ago
Answers
问题已经解决!!
后来我换了一个实现方法:
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 所有find开头的方法为只读,所有查询方法都以find开头 -->
<tx:method name="find*" read-only="true" />
<!-- 其余方法如果没有事务的时候,就开启新事务运行该方法,否则使用已有的事务运行该方法 -->
<!-- 关闭read-only保证save*,update*,delete*等方法可以修改数据 -->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- 设置com.sx.dao包下及其子包下的类的所有方法都加上txAdvice事务通知切片(主要用于自动实现Hibernate事务的提交回滚等) -->
<aop:config>
<aop:pointcut id="DaoPointCut" expression="execution(* com.sx.dao..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="DaoPointCut"/>
</aop:config>
御坂美琴
answered 9 years, 5 months ago