Hibernate Envers Easy Entity Auditing



Documentos relacionados
Auditoria Avançada de Persistência com Hibernate, JPA e Envers

Desmistificando o Hibernate Envers em 10 passos

Persistência de dados com JPA. Hélder Antero Amaral Nunes

Persistência de Dados em Java com JPA e Toplink

UFG - Instituto de Informática

Introdução à JPA-Java Persistence API

Mapeamento Lógico/Relacional com JPA

Persistindo dados com TopLink no NetBeans


Módulo 03. Mapeando Associações/Relacionamentos. Raphaela Galhardo.

1 Criar uma entity a partir de uma web application que usa a Framework JavaServer Faces (JSF)

JPA: Persistência padronizada em Java

Padrão J2EE Data Access Object (DAO)

Auditando persistência com JPA

Criar uma aplicação JPA2 com EclipseLink e H2

Java Persistence API. Entity Entity Campos e Propriedades Entity Chaves Primárias Entity Associações

Java Persistence Query Language JPQL

Hibernate. Mapeamento Objeto-Relacional. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

JPA Passo a Passo. Henrique Eduardo M. Oliveira henrique@voffice.com.br. Globalcode Open4Education

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Hibernate. Mapeamento O/R Marcio Aguiar Ribeiro

Java e Banco de Dados: JDBC, Hibernate e JPA

UFG - Instituto de Informática

RELACIONAMENTOS ENTRE OS OBJETOS NO FRAMEWORK HIBERNATE Elio Lovisi Filho 1 Ronney Moreira de Castro 2 RESUMO

HIBERNATE Criando um projeto em Java + Hibernate do zero

Aula 2 - Revisão de JPA (Java Persistence API)

Tutorial para criação de componentes JSF Facelets Por Érico GR 07/08/2007

Implementando uma Classe e Criando Objetos a partir dela

Curso de Java. Acesso a banco de dados através do Hibernate. Todos os direitos reservados Klais

Como o FIT funciona. FIT: Framework for Integrated Tests FIT. Dados de testes. Programa. Fixtures. classes. Resultados de testes

Vejamos um exemplo de uso da API. Como vimos, os agentes imobiliários de nosso aplicativo podem ingressar e visualizar as propriedades que possuem em

SDK Moip-PHP. O MoIP-PHP utiliza o padrão Fluent Interfaces, portanto, você pode fazer o exemplo acima da seguinte forma:

Persistência de Classes em Tabelas de Banco de Dados

2. O gerador de código estende DepthFirstAdapter implementando a interpretação que gerará código Jasmin a partir de Smallpascal.

Desenvolvimento de aplicações Web. Java Server Pages

Linguagem de Programação I. Orientação a Objetos em Java

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Aula 2 - Revisão de JPA (Java Persistence API)

UFG - Instituto de Informática

Rafael Santos. Instituto Nacional de Pesquisas Espaciais rafael.santos. Rafael Santos - rafael.

Curso Java Starter. 1

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

ALTO DESEMPENHO UTILIZANDO FRAMEWORK HIBERNATE E PADRÃO JAVA PERSISTENCE API

Algoritmos e Programação II. Sobrecarga

Capítulo 4. Packages e interfaces

3 Classes e instanciação de objectos (em Java)

Tuplas e Dicionários. Vanessa Braganholo vanessa@ic.uff.br

Sessões. Cookies HTTP Sessões Atributos de sessão

Desenvolvimento de Aplicações para Internet Aula 7

Programação Orientada a Objetos. Encapsulamento

Criando um CRUD RESTful com Jersey, JPA e MySQL

Especificação do Trabalho

Encapsulamento de Dados

Como usar o SQLReactor para persistência de objetos PHP num banco de dados

PROGRAMAÇÃO EM C# COM VISUAL STUDIO.NET

Manual de Instalação Atendimento 3.4

insfcanceof new public switch transient while byte continue extends for int null

MANIPULANDO BANCO DE DADOS NO POSTGRESQL SEM FAZER USO DE COMANDOS SQL

JPA (Java Persistence API) Marcos Kalinowski

ARQUITETURA SISGRAD. Manual de Utilização. Versão: 2.0. Criação: 05 de julho de 2007 Autor: André Penteado

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

Desenvolvimento com Android Studio. Aula 02 Widgets, Manipulação de Dados e Programação de Eventos

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Java Básico. Matrícula de Alunos. Marco Antonio, Arquiteto de Software TJDF Novembro/2005

Curso Java Starter. 1

Técnicas de Programação II

Exercícios de Revisão Java Básico

Capítulo 8. Introdução UML

Mapeando Entidades. Abaixo iremos mapear nossas classes. Fornecedor.java package entidades;

Curso PHP Aula 08. Bruno Falcão

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Sistemas Operacionais. Curso Técnico Integrado Profa: Michelle Nery

Persistência com JPA2 e Hibernate TREINAMENTOS

VENDAS DETALHE. Com as tabelas preenchidas abra execute agora o ireport, pressione CRTL+N ou vá ao menu File>> New.

TCC Prof.: Leandro A. F. Fernandes Conteúdo: Tipos Genéricos

Módulo 5 JPATransaction Camadas Turma Turma TurmaBC TurmaBC TurmaBC TurmaBC

Programação Na Web. Servlets: Como usar as Servlets. Agenda. Template genérico para criar Servlets Servlet 2.4 API

Desenvolvimento Web TCC Turma A-1

Criando campanhas e gerando pedidos de venda com o Telemarketing

Recursos avançados e Orientação a Objetos no PHP

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

Integração de livros fiscais com o Microsoft Dynamics AX 2009

Login. Criar um novo website File > New > WebSite Framework 4.5 Visual C# ASP.NET Empty Web Site Nome do projeto: WebLogin

Recuperando a chave do produto. s Chaves do produto Assinando contratos Usando o VLSC

Módulo Locação de Roupas

Evento.java. package dominio;

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Facebook. Java com o. Integrando Aplicações. Descubra como é fácil criar uma aplicação para rodar no Facebook. _capa

Programação Orientada a Objetos: Lista de exercícios #1. Bruno Góis Mateus

Android Banco de Dados. Ivan Nicoli

Resolvendo objeto-relacional impedance mismatch com hibernate

Noções Várias em Visual Basic

Programação Orientada a Objetos (DPADF 0063)

( TIAGO DOS SANTOS MENDES ) PROGRAMAÇÃO DISPOSITIVOS MOVEIS ANDROID STUDIO

Transcrição:

Hibernate Envers Easy Entity Auditing Auditando suas classes de persistência com Hibernate Envers Castro (@CastroAlexandre) Consultor (Summa) e Instrutor (Globalcode) SCJP, SCWCD, SCBCD, SCEA-I, SCSNI

Motivação Rastrear o histórico de mudanças de entidades para saber quem, quando e o que foi alterado. OK, EXIJO O DIREITO DE ALEGAR INSANIDADE. TEMOS PROVAS DE QUE VOCÊ ALTEROU O SISTEMA ONTEM.

Hibernate Envers API para auditar classes de persistência Baseado no conceito de revisões similiar ao Subversion Cada transação gera uma revisão 3.5............ ENVERS

Configuração Configure os event listeners do Hibernate Envers no persistence.xml Anote as classes ou os atributos da classe com @Audited

Configuração no persistence.xml <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" />

Configuração na classe @Entity @Audited public class City { @Id @GeneratedValue private int id; private String name; @ManyToOne private State state; } // CONSTRUCTORS // GETTERS AND SETTERS // ETC... @Entity public class City { @Id @GeneratedValue private int id; @Audited private String name; @Audited @ManyToOne private State state; } // CONSTRUCTORS // GETTERS AND SETTERS // ETC... As tabelas City_AUD e State_AUD serão criadas automaticamente para armazenar o histórico de mudanças das entidades City e State respectivamente.

Configuração na classe O nome da tabela que guarda o histórico de mudanças pode ser alterado com o uso da anotação @AuditTable Ou através de propriedades no persistence.xml que definem o prefixo e o sufixo do nome da tabela. @Entity @Audited @AuditTable( "TB_City_AUDIT" ) public class City { @Id @GeneratedValue private int id; private String name; @ManyToOne private State state; } // CONSTRUCTORS // GETTERS AND SETTERS // ETC... <property name="org.hibernate.envers.audit_table_prefix" value= TB_" /> <property name="org.hibernate.envers.audit_table_suffix" value="_audit" />

O que pode ser anotado com @Audited Tipos simples (Integer, String, Date, etc) Coleções Mapas de tipos simples Relacionamentos Componentes Custom Types @Audited

DEMO

Adicionando metadados nas revisões Para logar dados adicionais em uma revisão crie uma classe persistente e anote com @RevisionEntity, depois: Opção 1 : Defina pelo menos dois atributos nesta classe: + id : do tipo int ou long anotado com @RevisionNumber + date : do tipo long ou java.util.date anotado com @RevisionTimestamp Opção 2 : Simplesmente faça a classe estender org.hibernate.envers.defaultrevisionentity Crie um org.hibernate.envers.revisionlistener e passe a classe como parâmetro da anotação @RevisionEntity

Configuração da RevisionEntity @Entity @RevisionEntity( MyRevisionListener.class ) public class MyRevisionEntity extends DefaultRevisionEntity { private String user; } public String getuser() { return user; } public void setuser( final String user ) { this.user = user; } public class MyRevisionListener implements RevisionListener { public void newrevision( final Object revisionentity ) { ( (MyRevisionEntity) revisionentity ).setuser( "Castro" ); } }

Recuperando revisões O histórico de mudanças tem duas dimensões: A primeira (Horizontal) é o estado do banco de dados em uma dada revisão. A segunda (Vertical) são revisões de cada entidade alterada. O que pode ser recuperado: Revisões da Entidade Entidades da Revisão

Entidades e Revisões ENT. A ENT. B ENT. C ENTIDADES REV. 1 id = 1 name = "A" name = "B" id = 3 name = "C" REV. 2 name = "BX" REV. 3 id = 1 name = "AX" name = "BY" REVISÕES

Entidades da Revisão ENT. A ENT. B ENT. C ENTIDADES REV. 1 id = 1 name = "A" name = "B" id = 3 name = "C" REVISÃO 1 REV. 2 name = "BX" REV. 3 id = 1 name = "AX" name = "BY" REVISÕES

Entidades da Revisão ENT. A ENT. B ENT. C ENTIDADES REV. 1 id = 1 name = "A" name = "B" id = 3 name = "C" REV. 2 id = 1 name = "A" name = "BX" id = 3 name = "C" REVISÃO 2 REV. 3 id = 1 name = "AX" name = "BY" REVISÕES

Revisões da Entidade ENT. A ENT. B ENT. C ENTIDADES REV. 1 id = 1 name = "A" name = "B" id = 3 name = "C" REV. 2 name = "BX" REV. 3 id = 1 name = "AX" name = "BY" ENTIDADE B REVISÕES

Revisões da Entidade ENT. A ENT. B ENT. C ENTIDADES REV. 1 id = 1 name = "A" name = "B" id = 3 name = "C" REV. 2 name = "BX" id = 3 name = "C" REV. 3 id = 1 name = "AX" name = "BY" id = 3 name = "C" ENTIDADE C REVISÕES

Recuperando Revisões O histórico de mudanças pode ser recuperado através de queries semelhantes ao Hibernate Criteria A criação das queries é realizada através de um org.hibernate.envers.auditreader AuditReader reader = AuditReaderFactory.get( entitymanager );

Recuperando Revisões City oldcity = getauditreader.find( City.class, cityid, revision ); Recupera a entidade City com o id especificado na revisão informada, se a entidade não existir na revisão informada retorna null, se apenas algumas propriedades foram anotadas com @Audited apenas os dados dessas propriedades serão populados as demais propriedades não auditadas recebem null.

Recuperando Revisões Number revisioncount = (Number) getauditreader().createquery().forrevisionsofentity( City.class, false, true ).setprojection( AuditEntity.revisionNumber().count() ).getsingleresult(); Recupera a quantidade de revisões da entidade City.

Recuperando Revisões List<Object> result = getauditreader().createquery().forrevisionsofentity( City.class, false, true ).add( AuditEntity.property( "name" ).eq( "X" ) ).getresultlist(); Recupera as revisões da entidade City cujo nome da cidade é X.

DEMO

Resumindo Hibernate Envers...... não é intrusivo... é transparente... é baseado em revisões... é fácil de usar... permite adicionar metadados para cada revisão... permite pesquisar o histórico de mudanças através de critérios

Q&A

Referências http://www.jboss.org/envers http://download.jboss.org/envers/envers-1.2.2.ga-hibernate-3.3.pdf http://docs.jboss.org/envers/api-new/index.html http://jazoon.com/portals/0/content/archivwebsite/jazoon.com/jazoon09/downloa d/presentations/6220.pdf

THANKS! Castro (@CastroAlexandre) alexandre.s.castro@gmail.com