(澳门正规博彩十大网站) 关于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 saveUser user { try { getHibernateTemplate.saveuser; } catch RuntimeException e { System.out.println"UserDao >> save >> " + e; return false; } return true;
}

每次调用Dao方法都会报出上述那个错误,求救。。。。。

问题已经解决!!
后来我换了一个实现方法:
<!– 配置事务管理器 –>

<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>

Turn your Session into FlushMode.COMMIT/AUTO or remove readOnly marker from transaction definition.

<prop key="*">readOnly</prop>

所有方法都是readOnly了,你应该设置*的readOnly属性为false,然后设置Insert,Update,Delete,Save等等开头的方法的readOnly为true

发表评论

电子邮件地址不会被公开。 必填项已用*标注