Problema Hibernate Open-Session-In-View

Pessoal implementei o Esquema de Open Session In View no hibernate, ele esta adicionando corretamente no BD os dados, contudo quando um usuario tenta adicionar em uma tabela, algum dado, que pro exemplo, repita a informacao de uma coluna unique, to tendo o erro abaixo, jah tentei colocar try-catch na DAO na hora d salvar, mas o erro persiste (ocoore no filtro), ag teria alguma sugestao?

Erro

Jan 21, 2012 7:18:58 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/abr] threw exception [org.hibernate.AssertionFailure: null id in abr.clientes.Clientes entry (don't flush the Session after an exception occurs)] with root cause
org.hibernate.AssertionFailure: null id in abr.clientes.Clientes entry (don't flush the Session after an exception occurs)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at abr.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:67)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Classe dao, jah tentei por try-catch no save, mas n funcionou

package abr.clientes;

import org.hibernate.Session;
import org.hibernate.exception.ConstraintViolationException;

import abr.util.DAOException;

public class ClientesDAOHibernate implements ClientesDAO {

	private Session session;
	
	public void setSession(Session session){
		this.session = session;
	
	}
	
	@Override
	public void salvar(Clientes cliente){

			this.session.saveOrUpdate(cliente);
		
		
	}

}

Regra de negocio

package abr.clientes;

import abr.util.DAOException;
import abr.util.HibernateUtil;
import abr.util.RNException;


public class ClientesRN {
	
	private ClientesDAOHibernate clientesDAOHibernate;
	
	public ClientesRN(){
		clientesDAOHibernate = new ClientesDAOHibernate();
		clientesDAOHibernate.setSession(HibernateUtil.getSessionFactory().getCurrentSession());
	}
	
	public void salvar (Clientes cliente) {

			clientesDAOHibernate.salvar(cliente);
	
	}	

	
	
}

filtro hibernate


package abr.filter;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.SessionFactory;

import abr.util.HibernateUtil;



public class ConexaoHibernateFilter implements Filter {

	private SessionFactory	sf;

	public void init(FilterConfig config) throws ServletException {
		this.sf = HibernateUtil.getSessionFactory();
	}

	public void destroy() {
	}

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException {

		try {

			this.sf.getCurrentSession().beginTransaction();

			chain.doFilter(servletRequest, servletResponse);

			this.sf.getCurrentSession().getTransaction().commit();
			this.sf.getCurrentSession().close();

		} catch (Throwable ex) {
			try {
				if (this.sf.getCurrentSession().getTransaction().isActive()) {
					this.sf.getCurrentSession().getTransaction().rollback();
				}
			} catch (Throwable t) {
				t.printStackTrace();
			}
			throw new ServletException(ex);
		}
	}

}

web.xml

   <!-- Filtro do Hibernate -->
  <filter>
    <filter-name>conexaoFiter</filter-name>
    <filter-class>abr.filter.ConexaoHibernateFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>conexaoFiter</filter-name>
    <url-pattern>*.jsf</url-pattern>
  </filter-mapping>
 

Tenta fazer o try/catch no seu filter, e caso aconteça erro, não chame o flush.

Olha a mensagem de erro: don’t flush the Session after an exception occurs