2009-06-23 15 views
0

Ich versuche, ein einfaches envers Beispiel zu arbeiten. Ich habe den Java-Code funktioniert (anscheinend), und ich schließlich got the org.hibernate.tool.ant.EnversHibernateToolTask to work, aber es gibt nur SQL für die "regulären" Daten, nicht die Versionsdaten. Ich bin ratlos, was ich als nächstes tun soll.Schwierigkeiten, ein einfaches envers Beispiel zu arbeiten: Problem # 34

Was könnte ich vergessen zu gehören? Hier

ist die SQL es gibt: {Versionierung-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; 

Ich habe keine Geschichte Tabellen/Felder sehen. Hier sind die entsprechenden Einträge in meiner hibernate.cfg.xml Datei:

<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> 

und relevante Teile von Java-Klassen:

@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; 
    ... 
} 
+0

Welche Versionen von Hibernate und envers verwenden Sie? –

Antwort

0

Jason,

ich dieses Problem zu habe - ich hatte Envers arbeitet mit Hibernate, solange es mit dem JPA-Standard /META-INF/persistence.xml konfiguriert wurde.

Wenn ich zu hibernate.cfg.xml wechselte, wird Envers nicht mehr konfiguriert. Envers unterstützt jedoch die Hibernate-Sitzung, die ich zu nutzen versuche, da sie leistungsfähiger ist als die Standard-JPA-Spezifikationen.

Auch wenn Sie nicht wussten, wird Envers die Auditing-Tabellen auch für Sie generieren, alles was Sie brauchen sind die Anmerkungen.

Ich bin immer noch auf der Suche nach einer Antwort, aber wenn Sie ohne die Hibernate Session leben können, können Sie Envers schnell einsatzbereit machen, indem Sie Hibernate als JPA-Provider über/META-INF/Persistenz konfigurieren. XML.

Walter

+0

Wenn Sie eine 'Session' anstelle eines' EntityManager' brauchen, warum benutzen Sie nicht 'EntityManager.getDelegate()'? – whiskeysierra

1

Seien Sie sicher, dass Ihr Unternehmen POJOs mit "@Audited" zu annotieren. Das könnte erklären, warum die DDL für die Audit-Tabellen nicht erstellt wird.

0

Sie anscheinend fehlt eine Eigenschaft, die Versionsdaten zu speichern, wie zum Beispiel:

@Version 
private Integer versionNumber; 

// getters and setters 
...