?? hibernatehistorytest.java
字號:
package net.jeffrey.hibernate.history;import java.util.List;import javax.persistence.EntityManager;import javax.persistence.Persistence;import net.jeffrey.hibernate.Category;import net.jeffrey.hibernate.Product;import org.junit.After;import org.junit.Before;import org.junit.Test;import static org.junit.Assert.*;import static net.jeffrey.hibernate.history.OperationType.*;/** * Hibernate 審計日志測試用例 * @author jeffrey */public class HibernateHistoryTest { private EntityManager em; public HibernateHistoryTest() { } @Before public void setUp() { em = Persistence.createEntityManagerFactory("HibernateAuditHistoryPU").createEntityManager(); } @After public void tearDown() { em.close(); } @Test // 測試審計日志:創建對象 public void testCreateHistory() { Product p = new Product(); p.setName("Hibernate in Action"); // 保存新商品 em.getTransaction().begin(); em.persist(p); em.getTransaction().commit(); // 查找該對象關聯的操作日志 List<HistoryEntry> list = em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", p.getId()).getResultList(); assertEquals(1, list.size()); HistoryEntry h = list.get(0); // 日志關聯的實體類型與商品類應該相同 assertEquals(Product.class.getName(), h.getEntity().getName()); // 測試日志關聯的實體id是否正確 assertEquals(p.getId(), h.getEntityId()); // 該日志的操作類型應該是CREATE類型 assertEquals(CREATE, h.getOperationType()); // 測試是否正確生成了日期戳 assertNotNull(h.getTimestamp()); } @Test // 測試審計日志:簡單屬性的更新 public void testUpdatePropertyHistory() { Product p = em.find(Product.class, 1); assertNotNull(p); assertEquals("Core Java", p.getName()); p.setName("Core Java I"); em.getTransaction().begin(); em.merge(p); em.getTransaction().commit(); HistoryEntry h = (HistoryEntry) em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", p.getId()).getSingleResult(); assertEquals(Product.class.getName(), h.getEntity().getName()); assertEquals(p.getId(), h.getEntityId()); assertEquals(UPDATE, h.getOperationType()); // 更新的屬性是name assertEquals("name", h.getProperty()); // 更新前的值 assertEquals("Core Java", h.getPreviousValue()); // 更新后的值 assertEquals("Core Java I", h.getNewValue()); assertNotNull(h.getTimestamp()); } @Test // 測試審計日志:更新值與舊值相同 public void testUpdatePropertyBySameValue() { Product p = em.find(Product.class, 2); assertNotNull(p); assertEquals("JSF in Action", p.getName()); em.getTransaction().begin(); // 更新的值與原有值一樣 p.setName("JSF in Action"); em.merge(p); em.getTransaction().commit(); List list = em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", p.getId()).getResultList(); // 并沒有實際更新值,不應該生成審計日志 assertTrue(list.isEmpty()); } @Test // 測試審計日志:多對一的關聯對象的更新 public void testUpdateManyToOneMappingHistory() { Product p = em.find(Product.class, 3); assertEquals("iPhone", p.getName()); Category c1 = p.getCategory(); assertEquals("Mobile phone", c1.getName()); Category c2 = em.find(Category.class, 5); assertEquals("Toy", c2.getName()); em.getTransaction().begin(); // 變更該商品的類別,商品和類別是many to one p.setCategory(c2); em.merge(p); em.getTransaction().commit(); HistoryEntry h = (HistoryEntry)em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", p.getId()).getSingleResult(); assertEquals(Product.class.getName(), h.getEntity().getName()); assertEquals(UPDATE, h.getOperationType()); // 更新的屬性是category assertEquals("category", h.getProperty()); // 原有值應該是該商品原有類別的id assertEquals(c1.getId().toString(), h.getPreviousValue()); // 新值應該是新類別的id assertEquals(c2.getId().toString(), h.getNewValue()); } @Test // 測試審計日志:一對多的關聯對象的更新 public void testUpdateOneToManyMappingHistory() { Category c = em.find(Category.class, 6); assertEquals("Car", c.getName()); assertEquals(2, c.getProducts().size()); Product p = c.getProducts().get(1); assertEquals("SU-27", p.getName()); em.getTransaction().begin(); // 從一個類別Car中去除一個商品SU-27,類別和商品是 one to many c.removeProduct(p); em.merge(c); em.getTransaction().commit(); List list = em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Category.class) .setParameter("entityId", c.getId()).getResultList(); // 在category和product的一對多關聯中,product是主控端,hibernate只會觸發與product關聯的更新事件 // 所以category沒有關聯該次更新操作的審計日志 assertTrue(list.isEmpty()); HistoryEntry h = (HistoryEntry) em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", p.getId()).getSingleResult(); assertNotNull(h); // 但是,類別Car刪除商品SU-27,商品SU-27與類別Car解除了關聯關系。則會生成相應的更新審計日志 assertEquals(Product.class.getName(), h.getEntity().getName()); assertEquals(p.getId(), h.getEntityId()); assertEquals("category", h.getProperty()); assertEquals(UPDATE, h.getOperationType()); assertEquals(c.getId().toString(), h.getPreviousValue()); assertNull(h.getNewValue()); } @Test // 測試審計日志:刪除對象 public void testDeleteHistory() { Product p = em.find(Product.class, 2); assertNotNull(p); assertEquals("JSF in Action", p.getName()); em.getTransaction().begin(); em.remove(p); em.getTransaction().commit(); assertNull(em.find(Product.class, 2)); HistoryEntry h = (HistoryEntry) em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", p.getId()).getSingleResult(); // 實體對象已經刪除,但是通過其id仍然可以訪問到操作歷史的記錄 assertEquals(Product.class.getName(), h.getEntity().getName()); assertEquals(DELETE, h.getOperationType()); assertNotNull(h.getTimestamp()); } @Test // 測試審計日志:級聯刪除對象 public void testCascadeDeleteHistory() { Category c = em.find(Category.class, 2); assertEquals("Movie", c.getName()); em.getTransaction().begin(); em.remove(c); em.getTransaction().commit(); // category 和 product是級聯一對多的關系,如果刪除了category,會生成相應的所有關聯對象的刪除操作日志 HistoryEntry h1 = (HistoryEntry) em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", 6).getSingleResult(); assertNotNull(h1); assertEquals(DELETE, h1.getOperationType()); HistoryEntry h2 = (HistoryEntry) em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Product.class) .setParameter("entityId", 7).getSingleResult(); assertNotNull(h2); assertEquals(DELETE, h2.getOperationType()); HistoryEntry h3 = (HistoryEntry) em.createNamedQuery("HistoryEntry.findByEntity") .setParameter("entity", Category.class) .setParameter("entityId", 2).getSingleResult(); assertEquals(DELETE, h3.getOperationType()); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -