0

我正在尝试让一个简单的envers示例起作用。我有 Java 代码工作(显然),我终于让 org.hibernate.tool.ant.EnversHibernateToolTask​​ 工作,但它只输出“常规”数据的 SQL,而不是版本控制数据。我很困惑下一步该做什么。

我可能会忘记包括什么?

这是它输出的 SQL:{versioning-ddl.sql}

create table Event (
    id bigint generated by default as identity (start with 1),
    date timestamp,
    title varchar(255),
    primary key (id)
);

create table Person (
    id bigint generated by default as identity (start with 1),
    age integer not null,
    firstname varchar(255),
    lastname varchar(255),
    primary key (id)
);

create table PersonEvent (
    eventID bigint not null,
    personID bigint not null,
    primary key (eventID, personID)
);

alter table PersonEvent
    add constraint FK489E5C25F6E47374
    foreign key (personID)
    references Event;

alter table PersonEvent
    add constraint FK489E5C25729F3820
    foreign key (eventID)
    references Person;

我没有看到任何历史记录表/字段。以下是我的 hibernate.cfg.xml 文件中的相关条目:

<hibernate-configuration>
   <session-factory>
        ...
     <property name="hibernate.ejb.event.post-insert">org.hibernate.envers.event.AuditEventListener</property>
     <property name="hibernate.ejb.event.post-update">org.hibernate.envers.event.AuditEventListener</property>
     <property name="hibernate.ejb.event.post-delete">org.hibernate.envers.event.AuditEventListener</property>
     <property name="hibernate.ejb.event.pre-collection-update">org.hibernate.envers.event.AuditEventListener</property>
     <property name="hibernate.ejb.event.pre-collection-remove">org.hibernate.envers.event.AuditEventListener</property>
     <property name="hibernate.ejb.event.post-collection-recreate">org.hibernate.envers.event.AuditEventListener</property>
     <mapping class="com.example.test.hibernate.test1.Event"/>
     <mapping class="com.example.test.hibernate.test1.Person"/>
   </session-factory>
</hibernate-configuration>

和 Java 类的相关部分:

 @Entity
 @Audited
 public class Event {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private Date date;
    ...
 }


 @Entity
 @Audited
 public class Person {  
   @Id
   @GeneratedValue
   private Long id;

   private int age;
   private String firstname;
   private String lastname;
   ...
 }
4

3 回答 3

1

请务必使用“@Audited”注释您的实体 POJO。这可以解释为什么没有创建审计表的 DDL。

于 2010-10-12T16:37:23.977 回答
0

杰森,

我也遇到了这个问题 - 只要使用 JPA 标准 /META-INF/persistence.xml 配置 Envers,我就可以使用 Hibernate。

当我切换到 hibernate.cfg.xml 时,不再配置 Envers。然而,Envers 确实支持 Hibernate Session,这是我试图利用的,因为它比默认的 JPA 规范更强大。

此外,如果您不知道,Envers 也会为您生成审计表,您所需要的只是注释。

与此同时,我仍在寻找答案,但如果您可以在没有 Hibernate Session 的情况下生活,您可以通过使用 Hibernate 作为通过 /META-INF/persistence.xml 配置的 JPA 提供程序来快速启动和运行 Envers。

沃尔特

于 2009-08-08T22:16:27.213 回答
0

您显然缺少存储版本控制数据的属性,例如:

@Version
private Integer versionNumber;

// getters and setters
...
于 2011-03-02T20:14:14.533 回答