Hibernate Envers İle Versiyon(Logların) Kayıtlarının Sorgulanması

Hibernate Envers serisinin bir önceki yazısına buradan ulaşabilirsiniz. Bir Önceki yazıda Hibernate Envers hakkında bilgi verip, nasıl kullanılacağı ve kullanım detayları üzerinde durulmuştu. Bu yazının içeriğinde ise Hibernate Envers ile versiyonlama işlemi yapılan nesnelerin versiyon bilgilerini sorgulama üzerinde duracağız.

Sorgulama işlemi Hibernate Criteria ile benzerlik gösteriyor bu nedenle kolayca öğrenilebileceğini düşünüyorum. Direk kod örneklerine bakmak daha yararlı olacaktır. Yazının sonunda eclipse projesi olarak örnek proje paylaşılacaktır.

Adım adım yapılması gerekenler

1) Hibernate Envers entity versiyonları(logları) üzerinde sorgulama yapmak için AuditReader nesnesi oluşturuluyor. AuditReader nesnesi oluşturulurken sahip olunan hibernate session bilgisi verilir.

AuditReader reader = AuditReaderFactory.get(getSessionFactory().getCurrentSession());

2) Hangi entitye ait olan versiyonlar (loglar) üzerinde sorgulama işlemini yapacağımızı ve bununla ilgili detaylari belirtmek için AuditQuery nesnesi oluşturuluyor. Burada meslek entitysine ait olan versiyonlar üzerinde sorgulama yapacağımızı belirtiyoruz, forRevisionsOfEntity(Meslek.class, false, true) metodundaki ilk boolean parametre (selectEntitiesOnly parametresi) true olarak verilirse sadece meslek entitylerini, false olarak verilirse meslek entityleri ile birlikte revision detaylarıda sorgu sonucuna dahil edilir. İkinci boolean parametre (selectDeletedEntities parametresi) ise sorgulanacak versiyonlara(loglara) silinmiş olan entitylerin dahil edilmesi ile ilgilidir, eğer true olarak verilirse silinen entity versiyonları da sorgulama sonucunda getirilir. False olarak verilirse sorgulama sonucunda silinmiş entity logları gelmeyecektir.

AuditQuery auditQuery = reader.createQuery().forRevisionsOfEntity(Meslek.class, false, true);

3) Sorgulama için kriter ekleme işlemi. Entitynin sahip olduğu degişkenler ve revision bilgisi için kriterler eklenebilir.

/**
* Sorgulama icin kriter mevcut ise sorgulamaya ekleniyor.
*/
if (meslekAudit != null && meslekAudit.getMeslek() != null) {

	/**
	 * Meslek nesnesinin id bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getMeslek().getId() != null && meslekAudit.getMeslek().getId() != 0) {

		/**
		 * auditQuery nesnesine criter ekliyoruz. Buradakli kullanim
		 * criteriaApi ile benzerlik gosterir. Entity id si icin esitlik
		 * criteri ekleniyor.
		 */
		auditQuery.add(AuditEntity.id().eq(meslekAudit.getMeslek().getId()));
	}

	/**
	 * Meslek nesnesinin ad bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getMeslek().getAd() != null && !meslekAudit.getMeslek().getAd().trim().equals("")) {

		/**
		 * auditQuery nesnesine criter ekliyoruz. Entitynin ad isimli
		 * variable icin like kriteri ekleniyor..
		 */
		auditQuery.add(AuditEntity.property("ad").like(meslekAudit.getMeslek().getAd(), MatchMode.ANYWHERE));
	}

	/**
	 * Islemi yapan personel bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getUserName() != null && !meslekAudit.getUserName().trim().equals("")) {

		/**
		 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
		 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
		 * islemi kimin yaptigi bilgisi username esitlik kriteri
		 * ekleniyor.
		 */
		auditQuery.add(AuditEntity.revisionProperty("username").eq(meslekAudit.getUserName()));
	}

	/**
	 * Islemin yapilma tarih bilgisi kritere dahil ediliyor.
	 */
	if (meslekAudit.getOperationTime() != null) {

	/**
	 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
	 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
	 * islemin yapilma tarihi ile iligli esitlik kriteri ekleniyor.
	 */
	auditQuery.add(AuditEntity.revisionProperty("timestamp").gt(new Date().getTime()));
	}
}

4) Sorgu sonucunun alınması.

List<Object[]> resultList = null;

/**
 * Sorgulama sonucu elde ediliyor.
 */
resultList = auditQuery.getResultList();

List<MeslekAudit> meslekAuditListesi = new ArrayList<MeslekAudit>();

MeslekAudit auditMeslek;

for (Object[] data : resultList) {

	auditMeslek = new MeslekAudit();

	auditMeslek.setMeslek((Meslek) data[0]);

	auditMeslek.setUserName(((CustomRevisionEntity) data[1]).getUsername());

	Date islemYapilmaZamani = new Date();
	islemYapilmaZamani.setTime(((CustomRevisionEntity) data[1]).getTimestamp());
	auditMeslek.setOperationTime(islemYapilmaZamani);

	meslekAuditListesi.add(auditMeslek);
}

Adımların Tamamı.

/**
 * 
 * Meslek entitysinin versiyonlari uzerinde sorgulama islemi
 * gerceklestirilir. Sorgulama isleminde kriter parametre olarak verilmis
 * olan meslekAudit nesnesinin icerisinde bulunan userName,operationTime,
 * meslek.id,meslek.ad bilgileridir.
 * 
 * @param meslekAudit
 *            , sorgulama yapilirken gerekli kriterlere ait verilerin
 *            bilgisine sahiptir.
 * 
 * @return meslekAuditListesi, sorgulama sonucunda elde edilen meslekAudit
 *         nesnelerinin bulundugu listedir.
 * 
 * @throws Exception
 * 
 * @author Musa YUVACI
 * 
 * @version 1.0 11.07.2012
 * 
 */
@SuppressWarnings("unchecked")
@Override
public List<MeslekAudit> fetchMeslekVersionRecords(MeslekAudit meslekAudit) throws Exception {
	/**
	 * Hibernate Envers entity versiyonlari(loglari) uzerinde sorgulama
	 * yapmak icin AuditReader nesnesi olusturuluyor. AuditReader nesnesi
	 * olusturulurken sahip olunan hibernate sesion bilgisi parametre olarak
	 * geciliyor.
	 */
	AuditReader reader = AuditReaderFactory.get(getSessionFactory().getCurrentSession());

	/**
	 * Hangi entity versiyonlari (loglari) uzerinde sorgulama islemini
	 * yapacagimizi ve bununla ilgili detaylari belirtmek icin AuditQuery
	 * nesnesi olusturuluyor.		 
	 */
	AuditQuery auditQuery = reader.createQuery().forRevisionsOfEntity(Meslek.class, false, true);

	/**
	 * Sorgulama icin kriter mevcut ise sorgulamaya ekleniyor.
	 */
	if (meslekAudit != null && meslekAudit.getMeslek() != null) {

		/**
		 * Meslek nesnesinin id bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getMeslek().getId() != null && meslekAudit.getMeslek().getId() != 0) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Buradakli kullanim
			 * criteriaApi ile benzerlik gosterir. Entity id si icin esitlik
			 * criteri ekleniyor.
			 */
			auditQuery.add(AuditEntity.id().eq(meslekAudit.getMeslek().getId()));
		}

		/**
		 * Meslek nesnesinin ad bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getMeslek().getAd() != null && !meslekAudit.getMeslek().getAd().trim().equals("")) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Entitynin ad isimli
			 * variable icin like kriteri ekleniyor..
			 */
			auditQuery.add(AuditEntity.property("ad").like(meslekAudit.getMeslek().getAd(), MatchMode.ANYWHERE));
		}

		/**
		 * Islemi yapan personel bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getUserName() != null && !meslekAudit.getUserName().trim().equals("")) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
			 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
			 * islemi kimin yaptigi bilgisi username esitlik kriteri
			 * ekleniyor.
			 */
			auditQuery.add(AuditEntity.revisionProperty("username").eq(meslekAudit.getUserName()));
		}

		/**
		 * Islemin yapilma tarih bilgisi kritere dahil ediliyor.
		 */
		if (meslekAudit.getOperationTime() != null) {

			/**
			 * auditQuery nesnesine criter ekliyoruz. Fakat burada bir
			 * farklilik mevcut, kriterimiz revision bilgisi ile ilgili
			 * islemin yapilma tarihi ile iligli esitlik kriteri ekleniyor.
			 */
			auditQuery.add(AuditEntity.revisionProperty("timestamp").gt(new Date().getTime()));
		}
	}

	List<Object[]> resultList = null;

	/**
	 * Sorgulama sonucu elde ediliyor.
	 */
	resultList = auditQuery.getResultList();

	List<MeslekAudit> meslekAuditListesi = new ArrayList<MeslekAudit>();

	MeslekAudit auditMeslek;

	for (Object[] data : resultList) {

		auditMeslek = new MeslekAudit();

		auditMeslek.setMeslek((Meslek) data[0]);

		auditMeslek.setUserName(((CustomRevisionEntity) data[1]).getUsername());

		Date islemYapilmaZamani = new Date();
		islemYapilmaZamani.setTime(((CustomRevisionEntity) data[1]).getTimestamp());

		auditMeslek.setOperationTime(islemYapilmaZamani);

		meslekAuditListesi.add(auditMeslek);
	}

	return meslekAuditListesi;
}

Kaynak Kodlar ve Açıklama

Hibernate Envers projesinin kaynak kodlarını aşağıdaki linkden download edebilirsiniz. Kaynak kodları eclipse (SpringSourse Tool Suite) projesi olarak verilmiştir.

Hibernate Envers Sorgulama

SONUÇ

Hibnernate Envers ile elde edilen entity versiyon(loglar) bilgilerini sorgulama işlemini detaylı bir şekilde, kod örnekleri ile ele almış olduk. Hibernate Envers ile ilgili daha detaylı bilgi için referans dökümantasyonunu inceleyebilirsiniz.

Hibenrate Envers 3.6 Referans Dökümantasyonu

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir