0

I am working on a dynamic Web Application and I am stucked in this error : 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. The solutions proposed in StackOverFlow didn't resolve my problem ! I couldn't find where I am using the read-only mode ! This error appeared when I wanted to use my jsf page to save a new Intervention in the DataBase .I am using the default connector DataBase of Netbeans, working with Glassfish4, spring and hibernate 4. This is the stack trace :

Caused by: 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$12.doInHibernate(HibernateTemplate.java:620)
    at org.springframework.orm.hibernate4.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:617)
    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.save(HibernateTemplate.java:617)
    at dao.ImplIntervention.insert(ImplIntervention.java:29)
    at bo.InterventionImplBO.insert(InterventionImplBO.java:47)
    at jsf.bean.BeanIntervention.insert(BeanIntervention.java:123)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at javax.el.ELUtil.invokeMethod(ELUtil.java:332)
    at javax.el.BeanELResolver.invoke(BeanELResolver.java:537)
    at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:283)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 36 more

ImplIntervention.java :

    public class ImplIntervention extends HibernateDaoSupport implements IfaceIntervention{
@Autowired
public SessionFactory sessionFactory;

    @Override
    @Transactional
    public void insert(Intervention obj) {
        getHibernateTemplate().save(obj);
   }

    @Override
    public void delete(Intervention obj) {
     getHibernateTemplate().delete(obj);    
    }

    @Override
    public void update(Intervention obj) {
         getHibernateTemplate().merge(obj);
    }

    @Override
    public List<Intervention> getAll() {
         return (List<Intervention>)  (Object) getHibernateTemplate().find("from intervention");   
    }

}

InterventionImplBO.java:

public class InterventionImplBO {
private ImplIntervention interventionDAO; 

public ImplIntervention getInterventionDAO() {
    return interventionDAO;
}

public void setInterventionDAO(ImplIntervention interventionDAO) {
    this.interventionDAO = interventionDAO;
}



public void insert(BeanIntervention obj) {
Intervention intervention = new Intervention(); 
intervention.setCodem(obj.getCodem());
intervention.setCodereparation(obj.getCodereparation());
intervention.setDatedemandei(obj.getDatei());
intervention.setDatei(obj.getDatei());
intervention.setDescriptioni(obj.getDescriptioni());
intervention.setLogin(obj.getLogin());
intervention.setNumi(obj.getNumi());
intervention.setObjeti(obj.getObjeti());
interventionDAO.insert(intervention);
}

public void delete(BeanIntervention obj) {
Intervention intervention = new Intervention(); 
intervention.setNumi(obj.getNumi());
 interventionDAO.delete(intervention);
}


public void update(BeanIntervention obj) {
Intervention intervention = new Intervention(); 
intervention.setCodem(obj.getCodem());
intervention.setCodereparation(obj.getCodereparation());
intervention.setDatedemandei(obj.getDatei());
intervention.setDatei(obj.getDatei());
intervention.setDescriptioni(obj.getDescriptioni());
intervention.setLogin(obj.getLogin());
intervention.setNumi(obj.getNumi());
intervention.setObjeti(obj.getObjeti());
interventionDAO.update(intervention);

}

public List<BeanIntervention> getAll() {
List<BeanIntervention> liste = new ArrayList<BeanIntervention>();
for (Intervention obj: interventionDAO.getAll())
{
    BeanIntervention intervention = new BeanIntervention(); 
intervention.setCodem(obj.getCodem());
intervention.setCodereparation(obj.getCodereparation());
intervention.setDatedemandei(obj.getDatei());
intervention.setDatei(obj.getDatei());
intervention.setDescriptioni(obj.getDescriptioni());
intervention.setLogin(obj.getLogin());
intervention.setNumi(obj.getNumi());
intervention.setObjeti(obj.getObjeti());
}
return liste;
}

}

applicationContext.xml:

  <?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"></property>
<property name="url" value="jdbc:derby://localhost:1527/InterventionsDB;create=true"></property>
<property name="username" value="****"/>
<property name="password" value="****"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref = "dataSource"/>
    <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="connection.autoReconnect">true</prop>
            <prop key="connection.autoReconnectForPools">true</prop>
            <prop key="connection.is-connection-validation-required">true</prop>
        </props>
    </property>
</bean>
<bean id ="interventionDAO" class = "dao.ImplIntervention">
    <property name ="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id ="interventionBO" class = "bo.InterventionImplBO">
    <property name ="interventionDAO" ref="interventionDAO"></property>
</bean>

</beans>

web.xml :

    <?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
        <welcome-file>redirect.jsp</welcome-file>
    </welcome-file-list>
</web-app>
Tiny
  • 27,221
  • 105
  • 339
  • 599
fadhloun anis
  • 525
  • 1
  • 6
  • 13
  • 1
    You own a Java EE compliant container. Why don't you use container managed transactions instead, no configuration, no frustration like this? – Tiny Mar 14 '16 at 11:33
  • @Tiny how can I do that ? do I have to make a lot of changes in my code ? – fadhloun anis Mar 14 '16 at 11:49
  • 1
    Food for thought http://stackoverflow.com/q/18369356 Grabbing Spring while you already have a full fledged Java EE server with EJB at hands is kind of weird. If you were targeting a barebones serveltcontainer like Tomcat which you can't upgrade, using Spring for service layer would be understandable as there's no way to install EJB on a standalone Tomcat (without basically turning it into a TomEE). – BalusC Mar 14 '16 at 11:51

1 Answers1

0

You need to configure a PlatformTransactionManager in your application context to handle the @Transactional annotation. Modify you application context to include these bean definitions

<tx:annotation-driven/>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
   <property name="sessionFactory" ref="sessionFactory"/>
</bean>
ekem chitsiga
  • 5,523
  • 2
  • 17
  • 18
  • @ ekem chitsiga it gives me this error: Cannot convert value of type [com.sun.proxy.$Proxy327 implementing dao.IfaceMateriel,org.springframework.beans.factory.InitializingBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [dao.ImplMateriel] for property 'materielDAO': no matching editors or conversion strategy found – fadhloun anis Mar 14 '16 at 18:11