Hibernate Envers

5 respostas
fabianofrizzo

Bom Dia Comunidade.

Estou tendo um problema com Hibernate Envers e não consegui achar uma solução ainda para isso.

Estou tendo problemas em mapear Classes @Embeddable que tenha @ManyToOne

Segue minhas classes

@Audited
@AuditTable(value="lancamento_contabil_aud")
@Entity
@Table(name="lancamento_contabil")
public class LancamentoContabil implements Serializable {

	@EmbeddedId
	private LancamentoContabilPK pk;
	
    private BigDecimal valor;
	private boolean lancDeEncerramento;
	private boolean inconsistente;
	private boolean pendente;

	@Temporal(TemporalType.DATE)
    private Date data;

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
              org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
    @JoinColumns({
    	@JoinColumn(name="numero_lancamento_fk", referencedColumnName="numeroLancamento"),
    	@JoinColumn(name="ano_lancamento_fk", referencedColumnName="ano"),
    	@JoinColumn(name="colaborador_lancamento_fk", referencedColumnName="colaborador_cod_fk")
    })
    private List<ItemLancContabil> itensLancContabil;

A PK

@Embeddable
public class LancamentoContabilPK implements Serializable {
	
	@Column(nullable=false)
	private Integer numeroLancamento;
	
	@Column(nullable=false)
	private Integer ano;

	@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
	@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="colaborador_cod_fk", referencedColumnName="cod", nullable=false, insertable=false, updatable=false)
	private Colaborador colaborador;

Ja tentei de varias formas esses mapeamentos mas não tive sucesso em nenhum.
Segue o stacktrace

Caused by: org.hibernate.HibernateException: could not init listeners
at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:205)
at org.hibernate.cfg.Configuration.getInitializedEventListeners(Configuration.java:1980)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1842)
at br.com.optimuslabs.infra.persistence.MultiSchemaSessionFactory.createSessionFactory(MultiSchemaSessionFactory.java:90)
at br.com.optimuslabs.infra.persistence.MultiSchemaSessionFactory.createGlobalSessionFactory(MultiSchemaSessionFactory.java:76)
at br.com.optimuslabs.infra.persistence.MultiSchemaSessionFactory.create(MultiSchemaSessionFactory.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:340)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:293)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:130)
... 104 more
Caused by: org.hibernate.MappingException: Type not supported: org.hibernate.type.ManyToOneType
at org.hibernate.envers.configuration.metadata.IdMetadataGenerator.addIdProperties(IdMetadataGenerator.java:75)
at org.hibernate.envers.configuration.metadata.IdMetadataGenerator.addId(IdMetadataGenerator.java:120)
at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.generateFirstPass(AuditMetadataGenerator.java:410)
at org.hibernate.envers.configuration.EntitiesConfigurator.configure(EntitiesConfigurator.java:102)
at org.hibernate.envers.configuration.AuditConfiguration.(AuditConfiguration.java:97)
at org.hibernate.envers.configuration.AuditConfiguration.getFor(AuditConfiguration.java:129)
at org.hibernate.envers.event.AuditEventListener.initialize(AuditEventListener.java:337)
at org.hibernate.event.EventListeners$1.processListener(EventListeners.java:198)
at org.hibernate.event.EventListeners.processListeners(EventListeners.java:181)
at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:194)
... 116 more

Alguém ja trabalho com o Envers com esse tipo de relacionamento?
Tem solução, Será um BUG?

Fazem 3 dias já que estou procurando e até agora não tive sucesso.
Se alguém puder dar uma luz ficarei muito grato.

5 Respostas

FieroddPJ

Olá!
Não conheço o Hibernate Envers, porém nunca vi uma classe que representa um PK possuir um atributo ManyToOne, pra mim nem faz sentido, afinal quem possui um colaborador é lançamento contábil e não sua chave.

Creio que seu objeto colaborador deva ser um atributo da classe LancamentoContabil, pela a exceção lançada (org.hibernate.MappingException: Type not supported: org.hibernate.type.ManyToOneType), não é possível relacionar objetos com ids.

fabianofrizzo

Bom Dia Amigo.

Eu ja trabalhei e trabalho com PK composta dessa forma e sempre rodou sem problemas.

Concordo com vc que quem Colaborador pertence ao Lancamento. Porém cada colaborador, tem seus numeroLancamento iniciado em 1 todo ano.
Se eu tiver 5 Colaboradores como vou fazer para não dar erro de pk se todos os 5 vão ter algo como

numeroLancamento = 1
ano = 2011

A chave que diferência um dou outro é exatamente o id do colaborador.

Na verdade pelo que andei pesquisando esse erro é pequendo bug do Envers que ainda não foi corrigido e pelo visto não será corrigido muito cedo.

quikkoo

“fabianofrizzo”:
Eu ja trabalhei e trabalho com PK composta dessa forma e sempre rodou sem problemas.
mas vc fez isso usando EmbeddedId e jpa+hibernate?
pq isso tb me parece meio estranho, ao meu ver o Colaborador deve estar em LancamentoContabil e ñ em LancamentoContabilPK

uma classe embarcada ñ é uma entidade “relacional” propiamente dita, por isso ñ funciona, mas posso estar errado, então faça apenas um teste de mapear essas entidades sem o envers, só pra ver oq acontece, e depois tente com o envers mais sem o Colaborador, mas acredito q vc vai conseguir oq deseja colocando a classe Colaborador em LancamentoContabil

flw, t+

fabianofrizzo

Bom Dia Pessoal.

As classes estavam funcionando sem o envers normal.
Sem problema algum.

Este começou a ocorrer depois de adicionar o envers.
E como ja vi é um problema do envers mesmo.

kalibukalibu

Boa tarde pessoal,

@fabianofrizzo, vc conseguiu resolver o problema, estou enfrentando a mesma coisa.

Criado 4 de fevereiro de 2011
Ultima resposta 20 de jun. de 2011
Respostas 5
Participantes 4