Hibernate 5 入门指南-基于Envers

  1. 首先创建\META-INF\persistence.xml配置文件并做简单的配置

    <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 JPA tutorial of the Hibernate Getting Started Guide
           </description>

           <properties>
               <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
               <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/databaseName?useSSL=false&amp;serverTimezone=UTC&amp;verifyServerCertifate=false&amp;allowPublicKeyRetrieval=true" />
               <property name="javax.persistence.jdbc.user" value="root" />
               <property name="javax.persistence.jdbc.password" value="passwd" />
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
               <property name="hibernate.show_sql" value="true" />
               <property name="hibernate.format_sql" value="true"/>
               <property name="hibernate.hbm2ddl.auto" value="create" />
           </properties>

       </persistence-unit>

    </persistence>
  2. 创建实体Java类

    import java.util.Date;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;

    import org.hibernate.annotations.GenericGenerator;
    import org.hibernate.envers.Audited;

    @Entity
    @Table( name = "EVENTS" )
    @Audited  // <--- this tell Envers to audit (track changes to) this entity
    public class Event {
       private Long id;

       private String title;
       private Date date;

    public Event() {
    // this form used by Hibernate
    }

    public Event(String title, Date date) {
    // for application use, to create new events
    this.title = title;
    this.date = date;
    }

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
       public Long getId() {
    return id;
      }

       private void setId(Long id) {
    this.id = id;
      }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "EVENT_DATE")
       public Date getDate() {
    return date;
      }

       public void setDate(Date date) {
    this.date = date;   }​    public String getTitle() { return title;   }​    public void setTitle(String title) { this.title = title;   }​ @Override public int hashCode() { int result = title.hashCode(); result = 31 * result + date.hashCode(); return result; }}
  3. 向META-INF/persistence.xml文件中添加映射信息

    <class>类路径.Event</class>
  4. JUnit测试测试程序

    import java.util.Date;
    import java.util.List;
    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;

    /**
    * Illustrates the set up and use of Envers.
    * <p>
    * This example is different from the others in that we really need to save multiple revisions to the entity in
    * order to get a good look at Envers in action.
    *
    * @author Steve Ebersole
    */
    public class EnversIllustrationTest extends TestCase {
    private EntityManagerFactory entityManagerFactory;

    @Override
    protected void setUp() throws Exception {
    // like discussed with regards to SessionFactory, an EntityManagerFactory is set up once for an application
    // IMPORTANT: notice how the name here matches the name we gave the persistence-unit in persistence.xml!
    entityManagerFactory = Persistence.createEntityManagerFactory( "org.hibernate.tutorial.envers" );
    }

    @Override
    protected void tearDown() throws Exception {
    entityManagerFactory.close();
    }

    public void testBasicUsage() {
    // create a couple of events
    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();

    // now lets pull events from the database and list them
    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();​ // so far the code is the same as we have seen in previous tutorials. Now lets leverage Envers...​ // first lets create some revisions entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); Event myEvent = entityManager.find( Event.class, 2L ); // we are using the increment generator, so we know 2 is a valid id myEvent.setDate( new Date() ); myEvent.setTitle( myEvent.getTitle() + " (rescheduled)" );        entityManager.getTransaction().commit();        entityManager.close();​ // and then use an AuditReader to look back through history entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); myEvent = entityManager.find( Event.class, 2L ); assertEquals( "A follow up event (rescheduled)", myEvent.getTitle() ); AuditReader reader = AuditReaderFactory.get( entityManager ); Event firstRevision = reader.find( Event.class, 2L, 1 ); assertFalse( firstRevision.getTitle().equals( myEvent.getTitle() ) ); assertFalse( firstRevision.getDate().equals( myEvent.getDate() ) ); Event secondRevision = reader.find( Event.class, 2L, 2 ); assertTrue( secondRevision.getTitle().equals( myEvent.getTitle() ) ); assertTrue( secondRevision.getDate().equals( myEvent.getDate() ) ); entityManager.getTransaction().commit();        entityManager.close(); }}
  5. 运行测试

转载于:https://www.cnblogs.com/htsg/p/9889636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Hibernate 是一种: A. ORM框架 B. MVC框架 C. AOP框架 D. IOC框架 答案:A 2. MyBatis 是一种: A. ORM框架 B. MVC框架 C. AOP框架 D. IOC框架 答案:A 3. MyBatis-Plus 是一种: A. ORM框架 B. MVC框架 C. AOP框架 D. IOC框架 答案:A 4. Hibernate 支持的数据库类型包括: A. MySQL B. Oracle C. Microsoft SQL Server D. 所有主流数据库 答案:D 5. MyBatis 支持的数据库类型包括: A. MySQL B. Oracle C. Microsoft SQL Server D. 所有主流数据库 答案:D 6. MyBatis-Plus 支持的数据库类型包括: A. MySQL B. Oracle C. Microsoft SQL Server D. 所有主流数据库 答案:D 7. Hibernate 的核心特性包括: A. ORM映射 B. 缓存管理 C. 事务管理 D. 所有选项都是 答案:D 8. MyBatis 的核心特性包括: A. SQL映射 B. 缓存管理 C. 事务管理 D. 所有选项都是 答案:D 9. MyBatis-Plus 的核心特性包括: A. 自动代码生成 B. 缓存管理 C. 事务管理 D. 所有选项都是 答案:D 10. Hibernate 的二级缓存机制是基于: A. 内存 B. Redis C. Memcached D. Ehcache 答案:D 11. MyBatis 的二级缓存机制是基于: A. 内存 B. Redis C. Memcached D. Ehcache 答案:D 12. MyBatis-Plus 的二级缓存机制是基于: A. 内存 B. Redis C. Memcached D. Ehcache 答案:D 13. Hibernate 的一级缓存机制是基于: A. 内存 B. Redis C. Memcached D. Ehcache 答案:A 14. MyBatis 的一级缓存机制是基于: A. 内存 B. Redis C. Memcached D. Ehcache 答案:A 15. MyBatis-Plus 的一级缓存机制是基于: A. 内存 B. Redis C. Memcached D. Ehcache 答案:A 16. Hibernate 的事务管理支持: A. 编程式事务管理 B. 声明式事务管理 C. 两种都支持 D. 都不支持 答案:C 17. MyBatis 的事务管理支持: A. 编程式事务管理 B. 声明式事务管理 C. 两种都支持 D. 都不支持 答案:A 18. MyBatis-Plus 的事务管理支持: A. 编程式事务管理 B. 声明式事务管理 C. 两种都支持 D. 都不支持 答案:A 19. Hibernate 的主键生成策略包括: A. 自增长 B. UUID C. 序列 D. 所有选项都是 答案:D 20. MyBatis 的主键生成策略包括: A. 自增长 B. UUID C. 序列 D. 所有选项都是 答案:D 21. MyBatis-Plus 的主键生成策略包括: A. 自增长 B. UUID C. 序列 D. 所有选项都是 答案:D 22. Hibernate 的延迟加载机制是通过: A. 代理模式 B. 动态代理模式 C. CGLIB D. 所有选项都是 答案:A 23. MyBatis 的延迟加载机制是通过: A. 代理模式 B. 动态代理模式 C. CGLIB D. 所有选项都是 答案:A 24. MyBatis-Plus 的延迟加载机制是通过: A. 代理模式 B. 动态代理模式 C. CGLIB D. 所有选项都是 答案:A 25. Hibernate 的动态 SQL 生成是通过: A. HQL B. Criteria API C. SQL D. 所有选项都是 答案:B 26. MyBatis 的动态 SQL 生成是通过: A. HQL B. Criteria API C. SQL D. 所有选项都是 答案:C 27. MyBatis-Plus 的动态 SQL 生成是通过: A. HQL B. Criteria API C. SQL D. 所有选项都是 答案:B 28. Hibernate 的优点包括: A. 易于学习 B. 代码量少 C. 易于维护 D. 所有选项都是 答案:C 29. MyBatis 的优点包括: A. 易于学习 B. 代码量少 C. 易于维护 D. 所有选项都是 答案:A 30. MyBatis-Plus 的优点包括: A. 易于学习 B. 代码量少 C. 易于维护 D. 所有选项都是 答案:B 31. Hibernate 的缺点包括: A. 性能问题 B. 学习曲线陡峭 C. 代码量大 D. 所有选项都是 答案:A 32. MyBatis 的缺点包括: A. 性能问题 B. 学习曲线陡峭 C. 代码量大 D. 所有选项都是 答案:B 33. MyBatis-Plus 的缺点包括: A. 性能问题 B. 学习曲线陡峭 C. 代码量大 D. 所有选项都是 答案:C 34. 在 Hibernate 中,如何配置 ORM 映射? A. 使用注解 B. 使用 XML 文件 C. 两种都可 D. 都不可 答案:C 35. 在 MyBatis 中,如何配置 SQL 映射? A. 使用注解 B. 使用 XML 文件 C. 两种都可 D. 都不可 答案:B 36. 在 MyBatis-Plus 中,如何配置 SQL 映射? A. 使用注解 B. 使用 XML 文件 C. 两种都可 D. 都不可 答案:C 37. 在 Hibernate 中,如何进行复杂查询? A. 使用 HQL B. 使用 SQL C. 使用 Criteria API D. 所有选项都是 答案:D 38. 在 MyBatis 中,如何进行复杂查询? A. 使用 HQL B. 使用 SQL C. 使用 Criteria API D. 所有选项都是 答案:B 39. 在 MyBatis-Plus 中,如何进行复杂查询? A. 使用 HQL B. 使用 SQL C. 使用 Criteria API D. 所有选项都是 答案:C 40. 在 Hibernate 中,如何配置一对多关系? A. 使用 @OneToMany 注解 B. 在 XML 文件中配置 C. 两种都可 D. 都不可 答案:C 41. 在 MyBatis 中,如何配置一对多关系? A. 使用 @OneToMany 注解 B. 在 XML 文件中配置 C. 两种都可 D. 都不可 答案:B 42. 在 MyBatis-Plus 中,如何配置一对多关系? A. 使用 @OneToMany 注解 B. 在 XML 文件中配置 C. 两种都可 D. 都不可 答案:A 43. 在 Hibernate 中,如何配置多对多关系? A. 使用 @ManyToMany 注解 B. 在 XML 文件中配置 C. 两种都可 D. 都不可 答案:C 44. 在 MyBatis 中,如何配置多对多关系? A. 使用 @ManyToMany 注解 B. 在 XML 文件中配置 C. 两种都可 D. 都不可 答案:B 45. 在 MyBatis-Plus 中,如何配置多对多关系? A. 使用 @ManyToMany 注解 B. 在 XML 文件中配置 C. 两种都可 D. 都不可 答案:A 46. 在 Hibernate 中,如何进行分页查询? A. 使用 HQL B. 使用 SQL C. 使用 Criteria API D. 所有选项都是 答案:D 47. 在 MyBatis 中,如何进行分页查询? A. 使用 HQL B. 使用 SQL C. 使用 Criteria API D. 所有选项都是 答案:B 48. 在 MyBatis-Plus 中,如何进行分页查询? A. 使用 HQL B. 使用 SQL C. 使用 Criteria API D. 所有选项都是 答案:C 49. 在 Hibernate 中,如何配置多数据源? A. 使用 Spring Data JPA B. 使用 Hibernate Envers C. 使用 Spring Boot D. 所有选项都不是 答案:C 50. 在 MyBatis 中,如何配置多数据源? A. 使用 Spring Data JPA B. 使用 MyBatis Generator C. 使用 Spring Boot D. 所有选项都不是 答案:C

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值