package org.hibernate.envers.test.integration.notupdatable;
import junit.framework.Assert;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import javax.persistence.EntityManager;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
@TestForIssue(jiraKey = "HHH-5411")
public class PropertyNotUpdatableTest extends BaseEnversJPAFunctionalTestCase {
private Long id = null;
@Override
protected void addConfigOptions(Map options) {
options.put("org.hibernate.envers.store_data_at_delete", "true");
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] { PropertyNotUpdatableEntity.class };
}
@Test
@Priority(10)
public void initData() {
// Revision 1
EntityManager em = getEntityManager();
em.getTransaction().begin();
PropertyNotUpdatableEntity entity = new PropertyNotUpdatableEntity("data", "constant data 1", "constant data 2");
em.persist(entity);
em.getTransaction().commit();
id = entity.getId();
// Revision 2
em.getTransaction().begin();
entity = em.find(PropertyNotUpdatableEntity.class, entity.getId());
entity.setData("modified data");
entity.setConstantData1(null);
em.merge(entity);
em.getTransaction().commit();
em.close();
em = getEntityManager(); // Re-opening entity manager to re-initialize non-updatable fields
// with database values. Otherwise PostUpdateEvent#getOldState() returns previous
// memory state. This can be achieved using EntityManager#refresh(Object) method as well.
// Revision 3
em.getTransaction().begin();
entity = em.find(PropertyNotUpdatableEntity.class, entity.getId());
entity.setData("another modified data");
entity.setConstantData2("invalid data");
em.merge(entity);
em.getTransaction().commit();
// Revision 4
em.getTransaction().begin();
em.refresh(entity);
em.remove(entity);
em.getTransaction().commit();
}
@Test
public void testRevisionsCounts() {
Assert.assertEquals(Arrays.asList(1, 2, 3, 4), getAuditReader().getRevisions(PropertyNotUpdatableEntity.class, id));
}
@Test
public void testHistoryOfId() {
PropertyNotUpdatableEntity ver1 = new PropertyNotUpdatableEntity("data", "constant data 1", "constant data 2", id);
Assert.assertEquals(ver1, getAuditReader().find(PropertyNotUpdatableEntity.class, id, 1));
PropertyNotUpdatableEntity ver2 = new PropertyNotUpdatableEntity("modified data", "constant data 1", "constant data 2", id);
Assert.assertEquals(ver2, getAuditReader().find(PropertyNotUpdatableEntity.class, id, 2));
PropertyNotUpdatableEntity ver3 = new PropertyNotUpdatableEntity("another modified data", "constant data 1", "constant data 2", id);
Assert.assertEquals(ver3, getAuditReader().find(PropertyNotUpdatableEntity.class, id, 3));
}
@Test
public void testDeleteState() {
PropertyNotUpdatableEntity delete = new PropertyNotUpdatableEntity("another modified data", "constant data 1", "constant data 2", id);
List<Object> results = getAuditReader().createQuery().forRevisionsOfEntity(PropertyNotUpdatableEntity.class, true, true).getResultList();
Assert.assertEquals(delete, results.get(3));
}
}