尝试将对象保存到数据库时遇到了以下错误。我尝试了here1和here2提到的解决方案,但是效果不好。我遵循的是一个教程,但唯一的区别是Spring和Hibernate的版本。
我可以直接使用SessionFactory持久化对象,但是如果我使用HibernateDaoSupport尝试使用此方法,它将失败并显示以下错误
spring.xml
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" /> <property name="username" value="system" /> <property name="password" value="xxx" /> </bean> <context:annotation-config/> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="packagesToScan" value="org.sri.sphiber.model"></property> <property name="hibernateProperties"> <props> <prop key="dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <bean id="customerDAOImpl" class="org.sri.sphiber.dao.CustomerDAOImpl"> <property name="hibernateTemplate" ref="hibernateTemplate" /> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
CustomerDAOImpl.java
public class CustomerDAOImpl extends HibernateDaoSupport { public boolean insertCustomer(Customer cust){ try { getHibernateTemplate().saveOrUpdate(cust); } catch (DataAccessException e) { e.printStackTrace(); return false; } return true; } }
使用调用它。
public class MainClass { public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext("spring.xml"); CustomerDAOImpl hdi=appContext.getBean("customerDAOImpl",CustomerDAOImpl.class); Customer customer=new Customer(); customer.setCustomerName("Sri"); boolean isUpdated = hdi.insertCustomer(customer); } }
错误信息。
Aug 10, 2014 12:45:52 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema update complete 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. at org.springframework.orm.hibernate4.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1135) at org.springframework.orm.hibernate4.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:684) at org.springframework.orm.hibernate4.HibernateTemplate.doExecute(HibernateTemplate.java:340) at org.springframework.orm.hibernate4.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:308) at org.springframework.orm.hibernate4.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:681) at org.sri.sphiber.dao.CustomerDAOImpl.insertCustomer(CustomerDAOImpl.java:16) at org.sri.sphiber.main.MainClass.main(MainClass.java:26)
版本详细信息:
Spring version : spring-framework-4.0.6.RELEASE Hibernate Version : hibernate-release-4.3.5.Final Database : Orcale 11g
您缺少TransactionManager定义,请参阅http://docs.spring.io/spring- framework/docs/current/spring-framework- reference/html/transaction.html
[更新]以前我是用手机写的,所以很难提供详细信息,这是您需要做的:
Spring xml配置:
<tx:annotation-driven/>
将@Transactional批注添加到CustomerDaoImpl.insertCustomer方法
现在您的代码应该可以工作了。
请注意 ,@ Transactional批注应在服务层中使用,而不是在本示例中的DAO层中使用。 @Transactional注释告诉spring创建代理,该代理使用方面使用事务“包装”带注释的方法。