Hibernate: AssertionFailure após uma exceção devido a registros duplicados!

Olá pessoal, estou precisando de uma ajudinha com isso aqui:

Eu tenho um objeto (definido abaixo) que deve ser capaz de ser salvo no BD caso o campo “name” seja único. Além disso, eu quero que o campo id da tabela/objeto seja determinado automaticamente (auto inc).

No entanto, quando eu ponho o campo “name” (que possui uma constraint unique) com um valor duplicado, eu estou recebendo duas exceções.
A primeira reclama sobre a entrada duplicada, que era o que eu já estava esperando, mas a segunda exceção, que ocorre logo após, é uma AssertionFailure do Hibernate, reclamando que o id da minha entrada é nulo.

Pra mim, o problema consiste no fato de que, como a criação do registro não ocorre, devido à unique constraint, o id não está sendo gerado pelo banco e então o objeto retornado pelo hibernate fica com id nulo, gerando a segunda exceção internamente no hibernate.

Eu estou tratando essa exceção AssertionFailure, mas estou incomodado com o fato dela estar ocorrendo. Quero descobrir um modo de evitar que isso ocorra. Alguém tem alguma sugestão?
Estou colocando abaixo a stackTrace() e o meu código.
Muito obrigado, de antemão!

     [java] ERROR - JDBCExceptionReporter.logExceptions(78) |2009-04-12 18:54:48,566| Duplicate entry 'Diego' for key 'unique_name'
     [java] ERROR - HibernateConceptDAO.saveConceptClass(398) |2009-04-12 18:54:48,568| ConstraintViolationException - ConceptClass with name: Diego already exists.
     [java] ERROR - AssertionFailure.<init>(22) |2009-04-12 18:54:48,572| an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
     [java] org.hibernate.AssertionFailure: null id in org.openmrs.ConceptClass entry (don't flush the Session after an exception occurs)
     [java] 	at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:55)
     [java] 	at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:164)
     [java] 	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:120)
     [java] 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
     [java] 	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
     [java] 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
     [java] 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
     [java] 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
     [java] 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
     [java] 	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
     [java] 	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
     [java] 	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
     [java] 	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
     [java] 	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
     [java] 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
     [java] 	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
     [java] 	at $Proxy630.saveConceptClass(Unknown Source)
     [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
     [java] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     [java] 	at java.lang.reflect.Method.invoke(Unknown Source)
     [java] 	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
     [java] 	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198)
     [java] 	at $Proxy674.saveConceptClass(Unknown Source)
     [java] 	at org.openmrs.web.controller.concept.ConceptClassFormController.onSubmit(ConceptClassFormController.java:77)
     [java] 	at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:267)
     [java] 	at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:265)
     [java] 	at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
     [java] 	at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
     [java] 	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
     [java] 	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
     [java] 	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
     [java] 	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
     [java] 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
     [java] 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     [java] 	at org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:76)
     [java] 	at org.openmrs.module.web.filter.ModuleFilter.doFilter(ModuleFilter.java:58)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     [java] 	at org.openmrs.web.filter.OpenmrsFilter.doFilter(OpenmrsFilter.java:124)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     [java] 	at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
     [java] 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     [java] 	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
     [java] 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     [java] 	at org.openmrs.web.filter.initialization.InitializationFilter.doFilter(InitializationFilter.java:116)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     [java] 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     [java] 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
     [java] 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
     [java] 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
     [java] 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
     [java] 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
     [java] 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
     [java] 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
     [java] 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
     [java] 	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
     [java] 	at java.lang.Thread.run(Unknown Source)
     [java] ERROR - ConceptClassFormController.onSubmit(79) |2009-04-12 18:54:48,624| AssertionFailure Exception - null id in org.openmrs.ConceptClass entry (don't flush the Session after an exception occurs)
	public ConceptClass saveConceptClass(ConceptClass cc) throws DAOException {
		try {
			sessionFactory.getCurrentSession().saveOrUpdate(cc);
			return cc;
		} catch (ConstraintViolationException ex) {
			log.error("ConstraintViolationException - ConceptClass with name: " + cc.getName() + " already exists.");
			return null;
		}
	protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object obj,
	                                BindException errors) throws Exception {
		
		HttpSession httpSession = request.getSession();
		String view = getFormView();
		
		if (Context.isAuthenticated()) {
			String success = "";
			String error = "";
			
			MessageSourceAccessor msa = getMessageSourceAccessor();

			ConceptClass cc = null;
			
			try {
				cc = Context.getConceptService().saveConceptClass((ConceptClass) obj);	
			} catch (AssertionFailure ex) {
				log.error("AssertionFailure Exception - " + ex.getMessage());
			}
			
			if ( cc != null ) {
				success += msa.getMessage("ConceptClass.saved");
			} else {
				error += msa.getMessage("ConceptClass.cannot.save");
			}

			view = getSuccessView();
			
			if (!success.equals(""))
				httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, success);
			if (!error.equals(""))
				httpSession.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, error);
		}
		
		return new ModelAndView(new RedirectView(view));
	}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>

	<class name="org.openmrs.ConceptClass" table="concept_class">

		<id name="conceptClassId" type="java.lang.Integer"
			column="concept_class_id" unsaved-value="0">
			<generator class="native" />
		</id>

		<discriminator column="concept_class_id" insert="false" />

		<property name="name" type="java.lang.String" not-null="true" unique="true" length="255" />
		<property name="description" type="java.lang.String"
			not-null="true" length="255" />
		<property name="dateCreated" type="java.util.Date"
			column="date_created" not-null="true" length="19" />

		<many-to-one name="creator" class="org.openmrs.User"
			not-null="true" />

		<many-to-one name="retiredBy" class="org.openmrs.User"
			column="retired_by" />
		<property name="dateRetired" type="java.util.Date"
			column="date_retired" length="19" />
		<property name="retireReason" type="java.lang.String"
			column="retire_reason" length="255" />
		<property name="retired" type="boolean" length="1"
			not-null="true" />

	</class>
</hibernate-mapping>

Bom os problemas estao relacionados ao que vc jah disse, mas olhando tbm pela exceção lançada e tentando responder sua dúvida, diria que segunda a exceção isso pode ser um bug do hibernate.
this may indicate a bug in Hibernate
Do qual ele tbm diz que pode ser o uso incorretos de objeto na sessão.
but is more likely due to unsafe use of the session
O que pode estar lançando essa exceção de acordo com mais uma informações do console eh que vc estah tentando setar objetos na sessão de ser lançada a exceção.
don’t flush the Session after an exception occurs

Olá Diego!

Como está sendo dito no próprio console, também acho que pode ser um bug do hibernate e não achoe que esteja utilizando a sessão de forma errada. Dessa forma, te aconselho estar postando isso no site do hibernate para eles arrumarem se realmente for um bug.

Para resolver o seu problema, você poderia fazer essa verificação manualmente na aplicação. Uma outra alternativa seria você criar uma nova anotação do hibernate validator para verificar esse tipo de coisa no momento da validação.

[]s