Hibernate – Monitorando atualizações de entidades

19 04 2017

Problema

Preciso monitorar cada atualização da entidade para tentar descobrir a causa de um relacionada ao versionamento da entidade

Solução

Utilizar o Listner do hibernate

Como?

Escrever um Listener

public class DocumentoListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(DocumentoListener.class);

    @PostUpdate
    public void documentoPrePersist(Documento entidade) {
        logarAlteracao(entidade);
    }

    private void logarAlteracao(Documento entity) {
        String informacoesDocumento = buscarInformacoesDoDocumento(entity);
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("[PostUpdate] Documento atualizado no BD " + informacoesDocumento + getStackTraceComString());
        }
    }

Anotar a entidade que será monitorada

@EntityListeners(DocumentoListener.class)
@Entity
@Table(name = "DOCUMENTO")
public class Documento extends AbstractBusinessEntity {

Configurar o persistence.xml

<property name="org.hibernate.envers.revision_field_name" value="id_revision" />
			<property name="org.hibernate.envers.revision_type_field_name" value="tp_revision" />
			<property name="hibernate.ejb.event.post-insert" value="org.hibernate.ejb.event.EJB3PostInsertEventListener, org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.post-update" value="org.hibernate.ejb.event.EJB3PostUpdateEventListener, org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.post-delete" value="org.hibernate.ejb.event.EJB3PostDeleteEventListener, org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener" />
			<property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener" />

 

Links: LINK1, LINK2 e LINK3

Anúncios




Weblogic escondendo exceção do Hibernate

22 01 2015

Problema

Ao testar o mapeando de novas entidades no Weblogic 10.3 com EJB 2.0, quando ocorria uma exceção, o Weblogic não informava a causa especifica do problema, ou seja, escondia a exceção que vinha do Hibernate.

O método de de save do EJB estava com a seguinte anotação:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

 javax.ejb.TransactionRolledbackLocalException: Error committing transaction:; nested exception is: weblogic.transaction.internal.AppSetRollbackOnlyException: setRollbackOnly called on transaction
 at weblogic.ejb.container.internal.EJBRuntimeUtils.throwTransactionRolledbackLocal(EJBRuntimeUtils.java:232) ~[weblogic.jar:10.3.3.0]
 at weblogic.ejb.container.internal.EJBRuntimeUtils.throwEJBException(EJBRuntimeUtils.java:130) ~[weblogic.jar:10.3.3.0]
 at weblogic.ejb.container.internal.BaseLocalObject.postInvoke1(BaseLocalObject.java:626) ~[weblogic.jar:10.3.3.0]
 at weblogic.ejb.container.internal.BaseLocalObject.__WL_postInvokeTxRetry(BaseLocalObject.java:427) ~[weblogic.jar:10.3.3.0]
 at com.empresa.ngpc.session.consumerin.ProcessDocumentInBean_5943ts_ProcessDocumentInImpl.processDocument(ProcessDocumentInBean_5943ts_ProcessDocumentInImpl.java:65) ~[ProcessDocumentInBean_5943ts_ProcessDocumentInImpl.class:na]
 at com.empresa.ngpc.session.consumerin.ConsumerInBean.consumeQueue(ConsumerInBean.java:170) ~[ngproxy-connector-2.8.0.jar:na]
 at sun.reflect.GeneratedMethodAccessor526.invoke(Unknown Source) ~[na:na]
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
 at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
 at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.jee.intercept.MethodInvocationInvocationContext.proceed(MethodInvocationInvocationContext.java:104) [com.bea.core.repackaged.springframework.pitchfork_1.3.0.0_1-0.jar:1.0]
 at org.jboss.seam.intercept.EJBInvocationContext.proceed(EJBInvocationContext.java:44) [jboss-seam-wls-2.2.2.Final.jar:2.2.2.Final]
 at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:101) [jboss-seam-wls-2.2.2.Final.jar:2.2.2.Final]
 at org.jboss.seam.intercept.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:50) [jboss-seam-wls-2.2.2.Final.jar:2.2.2.Final]
 at sun.reflect.GeneratedMethodAccessor527.invoke(Unknown Source) ~[na:na]
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_22]
 at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_22]
 at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.jee.intercept.JeeInterceptorInterceptor.invoke(JeeInterceptorInterceptor.java:69) [com.bea.core.repackaged.springframework.pitchfork_1.3.0.0_1-0.jar:1.0]
 at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.jee.spi.MethodInvocationVisitorImpl.visit(MethodInvocationVisitorImpl.java:37) [com.bea.core.repackaged.springframework.pitchfork_1.3.0.0_1-0.jar:1.0]
 at weblogic.ejb.container.injection.EnvironmentInterceptorCallbackImpl.callback(EnvironmentInterceptorCallbackImpl.java:54) [weblogic.jar:10.3.3.0]
 at com.bea.core.repackaged.springframework.jee.spi.EnvironmentInterceptor.invoke(EnvironmentInterceptor.java:50) [com.bea.core.repackaged.springframework.pitchfork_1.3.0.0_1-0.jar:1.0]
 at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at com.bea.core.repackaged.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) [com.bea.core.repackaged.springframework.spring_1.1.0.0_2-5-3.jar:2.5.3]
 at $Proxy328.consumeQueue(Unknown Source) [na:na]
 at com.empresa.ngpc.session.consumerin.ConsumerInBean_450m52_ConsumerInImpl.consumeQueue(ConsumerInBean_450m52_ConsumerInImpl.java:53) [ConsumerInBean_450m52_ConsumerInImpl.class:na]
 at com.empresa.ngpc.controller.ConsumerTask.executeNow(ConsumerTask.java:119) [ngproxy-connector-2.8.0.jar:na]
 at com.empresa.ngpc.controller.ConsumerTask.run(ConsumerTask.java:94) [ngproxy-connector-2.8.0.jar:na]
 at java.util.TimerThread.mainLoop(Timer.java:512) [na:1.6.0_22]
 at java.util.TimerThread.run(Timer.java:462) [na:1.6.0_22]
 Caused by: weblogic.transaction.internal.AppSetRollbackOnlyException: setRollbackOnly called on transaction
 at weblogic.transaction.internal.TransactionImpl.setRollbackOnly(TransactionImpl.java:544) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.TransactionManagerImpl.setRollbackOnly(TransactionManagerImpl.java:325) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.TransactionManagerImpl.setRollbackOnly(TransactionManagerImpl.java:318) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at org.hibernate.ejb.AbstractEntityManagerImpl.markAsRollback(AbstractEntityManagerImpl.java:421) ~[hibernate-entitymanager-3.4.0.GA.jar:3.4.0.GA]
 at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:605) ~[hibernate-entitymanager-3.4.0.GA.jar:3.4.0.GA]
 at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:513) ~[hibernate-entitymanager-3.4.0.GA.jar:3.4.0.GA]
 at weblogic.transaction.internal.ServerSCInfo.doBeforeCompletion(ServerSCInfo.java:1214) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.ServerSCInfo.callBeforeCompletions(ServerSCInfo.java:1189) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.ServerSCInfo.startPrePrepareAndChain(ServerSCInfo.java:109) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.ServerTransactionImpl.localPrePrepareAndChain(ServerTransactionImpl.java:1301) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.ServerTransactionImpl.globalPrePrepare(ServerTransactionImpl.java:2117) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:257) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:224) ~[com.bea.core.transaction_2.6.1.0.jar:2.6.1.0]
 at weblogic.ejb.container.internal.BaseLocalObject.postInvoke1(BaseLocalObject.java:594) ~[weblogic.jar:10.3.3.0]
 ... 38 common frames omitted

 

Solução

Como o Weblogic escondia a exceção causa raiz ao finalizar a transação gerenciada por ele, foi necessário executar um flush “manual” em um try/catch, e assim foi possível capturar a exceção do Hibernate e corrigir o mapeamento.

Abaixo segue o código que utilizei para executar o flush manual:

    @In
    private EntityManager entityManager;
	
    @Override
    public void flush() {
        entityManager.flush();
    }

FONTE





Hibernate 4 mapeamento OnToMany remoção de nodos filhos com erro de ORA-01407

21 12 2012

Como estava o mapeamento

Classe: COMPRA


@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="COMPRA_ID")
private List<Item> itens;

Classe: ITEM


@ManyToOne
@JoinColumn(name = "COMPRA_ID", nullable=false)
private Compra compra;

Qual o erro apresentado ao remover um item


org.springframework.orm.hibernate4.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [n/a]; SQL state [72000]; error code [1407]; ORA-01407: não é possível atualizar ("LDIAS"."ITEM"."COMPRA_ID") para NULL
nested exception is org.hibernate.QueryTimeoutException: ORA-01407: não é possível atualizar ("LDIAS"."ITEM"."COMPRA_ID") para NULL

 

Solução

Utilizar os parâmetros corretos para forçar a remoção dos itens “sem pai” e evitar de fazer um update nesse itens “sem pai” :O

São eles: orphanRemoval=true e updatable=false


@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.EAGER)
@JoinColumn(name="COMPRA_ID", updatable=false)
private List<Item> itens;

 

 

FONTE: AQUI





[hibernate][jpa][Oracle] Problemas com palavras reservadas do BD

13 06 2011

Problema

No desenvolvimento de um sistema utilizando Hibernate + Spring + Oracle, tive alguns problemas para utilizar o bando do Oracle com Hibernate, o principal erro era  ORA-01747, que informa que algum nome de campo é uma palavra reservada para o Oracle.

 

ORA-01747: invalid user.table.column, table.column, or columns specification

 

Solução

Para solucionar o problema pesquisei todas as palavras que utilizei nos meus Beans e verifiquei se elas estavam na tabela abaixo, que o Oracle disponibiliza informando as palavras reservadas.

SELECT * FROM V$RESERVED_WORDS
WHERE keyword like 'OBSERVATION';