簡而言之,Enver就是版本控制,記錄數據庫操做,控制粒度爲字段,原理相似於SVNjava
1.pom.xml配置和Event.java的定義參考http://my.oschina.net/u/555061/blog/506052mysql
2.目錄結構有所不一樣sql
Enver是採用映射xml配置的,原來的映射配置爲hibernate.cfg.xml,如今爲persistence.xml,且persistence.xml所在目錄爲META-INF的下一級(目錄的問題應該能夠配置,但本人暫時未做研究)數據庫
3.查看下persistence.xmlapp
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="org.hibernate.tutorial.envers"> <description> Persistence unit for the Envers tutorial of the Hibernate Getting Started Guide </description> <class>org.hibernate.tutorial.envers.Event</class> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.191.1:3306/mysql" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="root" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties> </persistence-unit> </persistence>
改變也不是太大,主要就是
ide
<mapping class="org.hibernate.tutorial.annotations.Event"/>測試
改成了ui
<class>org.hibernate.tutorial.envers.Event</class>url
其實也就是寫法規定而已,問題不大spa
4.配置問題已經不是主要問題,版本控制查看應用是主要問題,以下
package org.hibernate.tutorial.envers; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.logging.Logger; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import junit.framework.TestCase; import org.hibernate.envers.AuditReader; import org.hibernate.envers.AuditReaderFactory; public class EnversIllustrationTest extends TestCase { private Logger logger = Logger.getLogger(EnversIllustrationTest.class.getName()); private EntityManagerFactory entityManagerFactory; @Override protected void setUp() throws Exception { entityManagerFactory = Persistence .createEntityManagerFactory("org.hibernate.tutorial.envers"); } @Override protected void tearDown() throws Exception { entityManagerFactory.close(); } public void testBasicUsage() { // 這裏主要演示如何使用EntityManagerFactory的這種方式去操做數據庫,插入2條數據 EntityManager entityManager = entityManagerFactory .createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist(new Event("Our very first event!", new Date())); entityManager.persist(new Event("A follow up event", new Date())); entityManager.getTransaction().commit(); entityManager.close(); // 這裏就是演示如何用EntityManagerFactory從數據庫查詢出對象list entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); List<Event> result = entityManager.createQuery("from Event", Event.class).getResultList(); for (Event event : result) { System.out.println("Event (" + event.getDate() + ") : " + event.getTitle()); } entityManager.getTransaction().commit(); entityManager.close(); // 下面就是要測試Enver的真正功能--版本控制 // 爲了建立不一樣的版本,這裏取出數據庫第二條記錄,修改它的title和date字段,致使其產生版本1和版本2,也就是下面的firstRevision和secondRevision entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); Event myEvent = entityManager.find(Event.class, 2L); myEvent.setDate(new Date()); myEvent.setTitle(myEvent.getTitle() + " (rescheduled)"); entityManager.getTransaction().commit(); entityManager.close(); // 這裏就是演示如何抽取不一樣的版本進行比較,相似於SVN版本控制的對比,這裏我不使用JUNIT的assert,而是習慣看logger打印 entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); myEvent = entityManager.find(Event.class, 2L);// 其實根據字段的比較就是想證實myEvent跟版本2是同樣的,跟版本1是不同的 AuditReader reader = AuditReaderFactory.get(entityManager); Event firstRevision = reader.find(Event.class, 2L, 1); //版本1--firstRevision logger.info("PRINT:firstRevision.getTitle().equals(myEvent.getTitle())"); logger.info(firstRevision.getTitle() + "|" + myEvent.getTitle()); logger.info("PRINT:firstRevision.getDate().equals(myEvent.getDate())"); logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(firstRevision.getDate()) + "|" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(myEvent.getDate())); Event secondRevision = reader.find(Event.class, 2L, 2); //版本2--secondRevision logger.info("PRINT:secondRevision.getTitle().equals(myEvent.getTitle())"); logger.info(secondRevision.getTitle() + "|" + myEvent.getTitle()); logger.info("PRINT:secondRevision.getDate().equals(myEvent.getDate())"); logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(secondRevision.getDate()) + "|" +new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(myEvent.getDate())); entityManager.getTransaction().commit(); entityManager.close(); } }
打印結果