package org.hibernate.envers.test.integration.reventity.trackmodifiedentities; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.envers.EntityTrackingRevisionListener; import org.hibernate.envers.exception.AuditException; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.StrIntTestEntity; import org.hibernate.envers.test.entities.StrTestEntity; import org.hibernate.envers.test.entities.reventity.trackmodifiedentities.CustomTrackingRevisionEntity; import org.hibernate.envers.test.entities.reventity.trackmodifiedentities.CustomTrackingRevisionListener; import org.hibernate.envers.test.entities.reventity.trackmodifiedentities.ModifiedEntityTypeEntity; import org.hibernate.envers.test.tools.TestTools; import org.junit.Test; import javax.persistence.EntityManager; /** * Tests proper behavior of entity listener that implements {@link EntityTrackingRevisionListener} * interface. {@link CustomTrackingRevisionListener} shall be notified whenever an entity instance has been * added, modified or removed, so that changed entity name can be persisted. * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ public class CustomTrackingEntitiesTest extends AbstractEntityTest { private Integer steId = null; private Integer siteId = null; @Override public void configure(Ejb3Configuration cfg) { cfg.addAnnotatedClass(ModifiedEntityTypeEntity.class); cfg.addAnnotatedClass(CustomTrackingRevisionEntity.class); cfg.addAnnotatedClass(StrTestEntity.class); cfg.addAnnotatedClass(StrIntTestEntity.class); } @Test @Priority(10) public void initData() { EntityManager em = getEntityManager(); // Revision 1 - Adding two entities em.getTransaction().begin(); StrTestEntity ste = new StrTestEntity("x"); StrIntTestEntity site = new StrIntTestEntity("y", 1); em.persist(ste); em.persist(site); steId = ste.getId(); siteId = site.getId(); em.getTransaction().commit(); // Revision 2 - Modifying one entity em.getTransaction().begin(); site = em.find(StrIntTestEntity.class, siteId); site.setNumber(2); em.getTransaction().commit(); // Revision 3 - Deleting both entities em.getTransaction().begin(); ste = em.find(StrTestEntity.class, steId); site = em.find(StrIntTestEntity.class, siteId); em.remove(ste); em.remove(site); em.getTransaction().commit(); } @Test public void testTrackAddedEntities() { ModifiedEntityTypeEntity steDescriptor = new ModifiedEntityTypeEntity(StrTestEntity.class.getName()); ModifiedEntityTypeEntity siteDescriptor = new ModifiedEntityTypeEntity(StrIntTestEntity.class.getName()); CustomTrackingRevisionEntity ctre = getAuditReader().findRevision(CustomTrackingRevisionEntity.class, 1); assert ctre.getModifiedEntityTypes() != null; assert ctre.getModifiedEntityTypes().size() == 2; assert TestTools.makeSet(steDescriptor, siteDescriptor).equals(ctre.getModifiedEntityTypes()); } @Test public void testTrackModifiedEntities() { ModifiedEntityTypeEntity siteDescriptor = new ModifiedEntityTypeEntity(StrIntTestEntity.class.getName()); CustomTrackingRevisionEntity ctre = getAuditReader().findRevision(CustomTrackingRevisionEntity.class, 2); assert ctre.getModifiedEntityTypes() != null; assert ctre.getModifiedEntityTypes().size() == 1; assert TestTools.makeSet(siteDescriptor).equals(ctre.getModifiedEntityTypes()); } @Test public void testTrackDeletedEntities() { ModifiedEntityTypeEntity steDescriptor = new ModifiedEntityTypeEntity(StrTestEntity.class.getName()); ModifiedEntityTypeEntity siteDescriptor = new ModifiedEntityTypeEntity(StrIntTestEntity.class.getName()); CustomTrackingRevisionEntity ctre = getAuditReader().findRevision(CustomTrackingRevisionEntity.class, 3); assert ctre.getModifiedEntityTypes() != null; assert ctre.getModifiedEntityTypes().size() == 2; assert TestTools.makeSet(steDescriptor, siteDescriptor).equals(ctre.getModifiedEntityTypes()); } @Test(expected = AuditException.class) public void testFindEntitiesChangedInRevisionException() { getAuditReader().getCrossTypeRevisionChangesReader(); } }