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>