Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.orm.hibernate3.support.OpenSessionInViewFilter;
public class CustomHibernateSessionFilter extends OpenSessionInViewFilter {
private static final Logger logger = LoggerFactory.getLogger(CustomHibernateSessionFilter.class);
public CustomHibernateSessionFilter() {
super();
logger.info("Initializing CustomHibernateSessionFilter");
}
protected Session getSession(SessionFactory sessionFactory)
throws DataAccessResourceFailureException {
logger.info("Set flush mode to AUTO");
Session session = super.getSession(sessionFactory);
session.setFlushMode(FlushMode.AUTO);
return session;
}
protected void closeSession(Session session, SessionFactory factory) {
logger.info("close session");
session.flush();
super.closeSession(session, factory);
}
}
Dans le web.xml, nous déclarons ensuite le filter:
<filter>
<filter-name>hibernateFilterWeb</filter-name>
<filter-class>fr.aquasys.dao.utils.CustomHibernateSessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilterWeb</filter-name>
<url-pattern>/web/*</url-pattern>
</filter-mapping>
</filter/>
Remarque:
Sur une configuration Tomcat6/Spring3.0/Hibernate3, nous utilisons avons différencié plusieurs contextes pour les services REST. Certains services sont diponibles via l'url /web/* comme ci-dessus et d'autres sous l'url /services/*. la balise url-pattern permet normalement de lister les url avec une syntaxe de la forme /web/*,/services/*. Or nous nous sommes aperçu que Tomcat n'arrivait pas à associer les url avec ce filter. Il a donc fallu déclarer 2 filters avec 2 url-pattern différents. A tester sur Tomcat 7...
Stéphane Barthon
Aucun commentaire:
Enregistrer un commentaire
Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.