只读模式下不允许写操作 – 持久化时发出

尝试将对象保存到数据库时,我一直面临以下错误。 我试过这里提到的解决方案1和here2但没有好处。 我正在学习一个教程,但唯一的区别是Spring和Hibernate的版本。

我可以使用SessionFactory直接持久化对象,但如果我使用HibernateDaoSupport尝试此操作,它会失败并出现以下错误

spring.xml

            org.hibernate.dialect.OracleDialect update true             

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

[更新]以前我是从我的手机写的,所以很难提供细节,这是你需要做的:

  1. Spring xml配置:

         
  2. 将@Transactional注释添加到CustomerDaoImpl.insertCustomer方法

现在你的代码应该工作了。

请注意 ,@ Transactal注释应该在服务层中使用,而不是像本例中那样在DAO层中使用。
@Transactional注释告诉spring创建使用方面“包装”带有事务的事务的注释方法的代理。

在配置文件中

做改变: –

 @Configuration @EnableTransactionManagement <-----Put this line public PersistenceConfig{ //your code } 

(要么)

 @Bean @Autowired public HibernateTemplate getHibernateTemplate(SessionFactory session) { HibernateTemplate hb = new HibernateTemplate(); hb.setCheckWriteOperations(false); hb.setSessionFactory(session); return hb; }