Hibernate Audit


Merhaba,

Log nedir?

Kısaca tanımlamak istersek çalışma zamanında hata,olay veya geçmişin kaydedilmesi olayıdır. Örnek verecek olursak bir kayıt ne zaman hangi hatayı vermiş. Bir kayıdı hangi kullanıcı ne zaman eklemiş ne zaman güncellemiş ne zaman silmiş vb.
Yaptığınız uygulamalarda log tutma işlemi kaçınılmaz bir son. Veritabanına kayıt ettiğimiz bilgilerin hangi kullanıcı tarafından,ne zaman , hangi alanların değiştiğini veritabanında tutmamız gerekebilir. Yani iz takibi yapmamız gerekebilir. Hibernate'in geliştirmiş olduğu Envers Audit  bu iş için biçilmiş kaftandır.

Hibernate Envers'i buradan güncel versiyonu indirip projenize ekleyebilirsiniz veya Maven projeleri için


<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-envers</artifactId> 
    <version>5.2.4.Final</version> 
</dependency>



persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="com.kurtomerfaruk_HibernateAudit_war_1.0PU" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:app/jdbc/sakila</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        </properties>
    </persistence-unit>
</persistence>



Audit yapılmasını istediğiniz Entity'e @Audited  eklemeniz yeterli olacaktır.
@Entity
@Table(name = "actor")
@Audited
@XmlRootElement


Veritabanınızdaki revizyonları tutmak için bağlı bulunduğunuz veritabanında revinfo adında bir tablonuzun olması gerekmektedir.
CREATE TABLE `revinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `revtstmp` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

Audit işleminin yapılması için Audit işleminin yapıldığı tablonun bir benzeri sonunda _aud ismi ile biten tablonuzun olması gerekiyor. Örneğin actor  diye bir tablonuz var ve bunun logunu tutacaksanız actor_aud diye bir tablonuzunda olması gerekiyor.

actor
CREATE TABLE `actor` (
  `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`actor_id`),
  KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8;


actor_aud
CREATE TABLE `actor_aud` (
 `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
 `first_name` varchar(45) NOT NULL,
 `last_name` varchar(45) NOT NULL,
 `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `revtype` varchar(45) DEFAULT NULL,
 `rev` varchar(45) NOT NULL,
 PRIMARY KEY (`actor_id`,`rev`),
 KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8;


Böylece yapmış olduğunuz değişiklikler actor_aud tablosunda görünecektir. Eğer _aud yerine örneğin _log yapmak istiyorsanız bunun için persistence.xml dosyasına aşağıdaki property i eklemeniz yeterli olacaktır.
<property name="org.hibernate.envers.audit_table_suffix" value="_log" />



Sorunsuz javalı günler

Yorum Gönder

0 Yorumlar