He estado enfrentando el siguiente error al intentar guardar el objeto en la base de datos. He probado la solución mencionado here1 y here2 pero no es bueno. Yo estaba siguiendo un tutorial pero la única diferencia es que las versiones de Spring y Hibernate.

Soy capaz de persistir el objeto en forma directa con el SessionFactory pero falla con el siguiente mensaje de error si lo intento con 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;
    }

}

Invocar utilizando.

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

    }


}

Mensaje de Error.

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)

Detalles De La Versión :

Spring version : spring-framework-4.0.6.RELEASE
Hibernate Version : hibernate-release-4.3.5.Final
Database : Orcale 11g
InformationsquelleAutor Srivatsa N | 2014-08-09

2 Comentarios

  1. 6

    Le falta TransactionManager definición, consulte http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/transaction.html

    [ACTUALIZACIÓN]
    Anteriormente yo estaba escribiendo desde mi móvil, así que fue duro para proveer a los detalles, aquí es lo que usted necesita hacer:

    1. Primavera xml de configuración:

      <tx:annotation-driven/>
      <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
      <property name="sessionFactory" ref="sessionFactory" /> 
      </bean> 
    2. Agregar @Transactional anotación a CustomerDaoImpl.método insertCustomer

    Ahora tu código debería funcionar.

    Tenga en cuenta que @Transactional anotación debe ser utilizado en la capa de servicio, no en la capa DAO, como en este ejemplo.

    @Transactional anotación dice la primavera para crear proxy que «envuelve» método anotado con la transacción utilizando aspectos.

    • He añadido el TransactionManager como sugerido por usted (editado en cuestión) , pero todavía tengo el mismo error, me fuerza a seguir bastante de eso. ¿Puede por favor explicar un poco más sobre esto ? Gracias.
    • Actualizado, a ver si ahora funciona
    • Sólo funcionaba como el encanto, estaba buscando un bean llamado transactionManager en lugar de txManager. Déjame echar un vistazo a la documentación de nuevo. Supongo que echo de menos entendido de la manera en que funciona. 🙂 Muchas gracias
    • Si usted configura su primavera de aplicación mediante programación puede agregar @ EnableTransactionManagement anotación que es el equivalente para <tx:anotación-driven/>. Tan sólo añadir @EnableTransactionManagement anotación a su @ de Configuración anotado clase.
  2. 0

    En el archivo de configuración

    hacer el cambio:-

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

    (O)

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

Dejar respuesta

Please enter your comment!
Please enter your name here