11. EXEMPLOS
@Entity
@Entity @RevisionEntity(EnversRevisionListener.class)
@Table(name = "ecm_address") //renomeado para suportar a mudanca no ER @Table(name = "ecm_login_rev_entity")
@AttributeOverride(name = "id", column = @Column(name = "addressId")) public class LoginRevEntity {
@Audited
public class Address extends AbstractEntity { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String rua; @RevisionNumber
private String bairro; private Long id;
private String CEP;
private String complemento; private String usuario;
private String pontoReferencia;
private Boolean entrega; @RevisionTimestamp
private long timestamp;
public class EnversRevisionListener implements RevisionListener {
@Override
public void newRevision(Object revisionEntity) {
Map<String,Object> session = ActionContext.getContext().getSession();
if(session != null) {
ApplicationUserElementSession userSession = (ApplicationUserElementSession) session.get(Constants.APPLICATION_USER_SESSION);
LoginRevEntity exampleRevEntity = (LoginRevEntity) revisionEntity;
exampleRevEntity.setTimestamp(new Date().getTime());
if(userSession != null) {
User userAutenticated = userSession.getUserAutenticate();
exampleRevEntity.setUsuario(userAutenticated.getLogin());
}
else {
exampleRevEntity.setUsuario("new_user");
}
}
}
}
terça-feira, 21 de fevereiro de 12
12. CONSULTAS
CONCEITO DE REVISÕES
terça-feira, 21 de fevereiro de 12
13. CONSULTAS
• Entidades em revisão
• Revisões sobre entidades
• Elementos inspirados por consultas com estilos Criteria
• Impossibilidade de realizar consultas com recursos JPA
• Conhecendo o modelo, podemos utilizar SQL para gerar relatórios
auditReader.createQuery()
.forRevisionsOfEntity(Person.class, false, true)
.addProjection(AuditEntity.revisionNumber().count())
.add(AuditEntity.id().eq(person.getId()))
.getSingleResult()
terça-feira, 21 de fevereiro de 12
15. Performance
DESEMPENHO
Must be slower than without auditing:
• Um INSERT para cada entidade modificada
1 insert for each modified entity
• Um INSERT para cara transação
1 insert for each transaction
MySQL 5.1.30 5000 1000 5000
(InnoDB) inserts complex inserts updates
Not audited 6.307s 6.622s 8.487s
Audited 9.807s 12.758s 11.444s
Difference x 1.55 x 1.92 x 1.34
42 www.devoxx.com
terça-feira, 21 de fevereiro de 12 42
16. COMO FICARIA NO SPO ??
- Interface de administração
* Propriedades do sistema
* Dados de auditoria
terça-feira, 21 de fevereiro de 12
17. CONCLUSÕES
• SOLUÇÕES DE AUDITORIA EM BASE DE DADOS LOCAIS
•+ desempenho
•+ flexibilidade
•+ controle
•- XML/SOAP
terça-feira, 21 de fevereiro de 12
18. REFERÊNCIAS
• JBoss Comunity - Envers Documentation: http://www.jboss.org/envers
• Adam Warski Blog - Criador do Envers: http://www.warski.org/blog/
• Textos explicativos: www.nelsonalone.com.br
terça-feira, 21 de fevereiro de 12