package org.hibernate.envers.test.integration.strategy; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.manytomany.SetOwnedEntity; import org.hibernate.envers.test.entities.manytomany.SetOwningEntity; import org.junit.Test; import javax.persistence.EntityManager; import java.util.Arrays; import java.util.HashSet; import static org.junit.Assert.*; /** * Tests the ValidityAuditStrategy on many-to-many Sets. * It was first introduced because of a bug when adding and removing the same element * from the set multiple times between database persists. * Created on: 24.05.11 * * @author Oliver Lorenz * @since 3.6.5 */ public class ValidityAuditStrategyManyToManyTest extends AbstractEntityTest { private Integer ing_id; private Integer ed_id; @Override public void configure(Ejb3Configuration cfg) { cfg.addAnnotatedClass(SetOwningEntity.class); cfg.addAnnotatedClass(SetOwnedEntity.class); cfg.setProperty("org.hibernate.envers.audit_strategy", "org.hibernate.envers.strategy.ValidityAuditStrategy"); } @Test @Priority(10) public void initData() { final EntityManager em = getEntityManager(); final SetOwningEntity setOwningEntity = new SetOwningEntity(1, "parent"); final SetOwnedEntity setOwnedEntity = new SetOwnedEntity(2, "child"); // Revision 1: Initial persist em.getTransaction().begin(); em.persist(setOwningEntity); em.persist(setOwnedEntity); em.getTransaction().commit(); em.clear(); ing_id = setOwningEntity.getId(); ed_id = setOwnedEntity.getId(); } @Test @Priority(5) public void testMultipleAddAndRemove() { final EntityManager em = getEntityManager(); // Revision 2: add child for first time em.getTransaction().begin(); SetOwningEntity owningEntity = getEntityManager().find(SetOwningEntity.class, ing_id); SetOwnedEntity ownedEntity = getEntityManager().find(SetOwnedEntity.class, ed_id); owningEntity.setReferences(new HashSet<SetOwnedEntity>()); owningEntity.getReferences().add(ownedEntity); em.getTransaction().commit(); em.clear(); // Revision 3: remove child em.getTransaction().begin(); owningEntity = getEntityManager().find(SetOwningEntity.class, ing_id); ownedEntity = getEntityManager().find(SetOwnedEntity.class, ed_id); owningEntity.getReferences().remove(ownedEntity); em.getTransaction().commit(); em.clear(); // Revision 4: add child again em.getTransaction().begin(); owningEntity = getEntityManager().find(SetOwningEntity.class, ing_id); ownedEntity = getEntityManager().find(SetOwnedEntity.class, ed_id); owningEntity.getReferences().add(ownedEntity); em.getTransaction().commit(); em.clear(); // Revision 5: remove child again em.getTransaction().begin(); owningEntity = getEntityManager().find(SetOwningEntity.class, ing_id); ownedEntity = getEntityManager().find(SetOwnedEntity.class, ed_id); owningEntity.getReferences().remove(ownedEntity); em.getTransaction().commit(); em.clear(); // now the set owning entity list should be empty again owningEntity = getEntityManager().find(SetOwningEntity.class, ing_id); assertEquals(owningEntity.getReferences().size(), 0); } @Test public void testRevisionsCounts() { assertEquals(getAuditReader().getRevisions(SetOwningEntity.class, ing_id), Arrays.asList(1, 2, 3, 4, 5)); assertEquals(getAuditReader().getRevisions(SetOwnedEntity.class, ed_id), Arrays.asList(1, 2, 3, 4, 5)); } @Test public void testHistoryOfIng1() { SetOwningEntity ver_empty = createOwningEntity(); SetOwningEntity ver_child = createOwningEntity(new SetOwnedEntity(ed_id, "child")); assertEquals(getAuditReader().find(SetOwningEntity.class, ing_id, 1), ver_empty); assertEquals(getAuditReader().find(SetOwningEntity.class, ing_id, 2), ver_child); assertEquals(getAuditReader().find(SetOwningEntity.class, ing_id, 3), ver_empty); assertEquals(getAuditReader().find(SetOwningEntity.class, ing_id, 4), ver_child); assertEquals(getAuditReader().find(SetOwningEntity.class, ing_id, 5), ver_empty); } @Test public void testHistoryOfEd1() { SetOwnedEntity ver_empty = createOwnedEntity(); SetOwnedEntity ver_child = createOwnedEntity(new SetOwningEntity(ing_id, "parent")); assertEquals(getAuditReader().find(SetOwnedEntity.class, ed_id, 1), ver_empty); assertEquals(getAuditReader().find(SetOwnedEntity.class, ed_id, 2), ver_child); assertEquals(getAuditReader().find(SetOwnedEntity.class, ed_id, 3), ver_empty); assertEquals(getAuditReader().find(SetOwnedEntity.class, ed_id, 4), ver_child); assertEquals(getAuditReader().find(SetOwnedEntity.class, ed_id, 5), ver_empty); } private SetOwningEntity createOwningEntity(SetOwnedEntity... owned) { SetOwningEntity result = new SetOwningEntity(ing_id, "parent"); result.setReferences(new HashSet<SetOwnedEntity>()); for (SetOwnedEntity setOwnedEntity : owned) { result.getReferences().add(setOwnedEntity); } return result; } private SetOwnedEntity createOwnedEntity(SetOwningEntity... owning) { SetOwnedEntity result = new SetOwnedEntity(ed_id, "child"); result.setReferencing(new HashSet<SetOwningEntity>()); for (SetOwningEntity setOwningEntity : owning) { result.getReferencing().add(setOwningEntity); } return result; } }