[hibernate-commits] Hibernate SVN: r15571 - in core/trunk/envers/src: test/java/org/hibernate/envers/test/integration/inheritance and 5 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Nov 17 02:19:44 EST 2008


Author: adamw
Date: 2008-11-17 02:19:44 -0500 (Mon, 17 Nov 2008)
New Revision: 15571

Added:
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java
Modified:
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
   core/trunk/envers/src/test/resources/testng.xml
Log:
HHH-3564: support for joined inheritance with tests

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java	2008-11-16 16:48:22 UTC (rev 15570)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -293,8 +293,14 @@
                 break;
 
             case JOINED:
-                throw new MappingException("Joined inheritance strategy not supported for auditing!");
+                mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "joined-subclass");
 
+                // Adding the "key" element with all columns + the revision number column
+                Element keyMapping = mappingData.getFirst().addElement("key");
+                MetadataTools.addColumns(keyMapping, pc.getIdentifierProperty().getColumnIterator());
+                MetadataTools.addColumn(keyMapping, verEntCfg.getRevisionPropName(), null);
+                break;
+
             case TABLE_PER_CLASS:
                 mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "union-subclass");
                 break;

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,94 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ChildAuditing extends AbstractEntityTest {
+    private Integer id1;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(ChildEntity.class);
+        cfg.addAnnotatedClass(ParentEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+
+        id1 = 1;
+
+        // Rev 1
+        em.getTransaction().begin();
+        ChildEntity ce = new ChildEntity(id1, "x", 1l);
+        em.persist(ce);
+        em.getTransaction().commit();
+
+        // Rev 2
+        em.getTransaction().begin();
+        ce = em.find(ChildEntity.class, id1);
+        ce.setData("y");
+        ce.setNumber(2l);
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(ChildEntity.class, id1));
+    }
+
+    @Test
+    public void testHistoryOfChildId1() {
+        ChildEntity ver1 = new ChildEntity(id1, "x", 1l);
+        ChildEntity ver2 = new ChildEntity(id1, "y", 2l);
+
+        assert getAuditReader().find(ChildEntity.class, id1, 1).equals(ver1);
+        assert getAuditReader().find(ChildEntity.class, id1, 2).equals(ver2);
+
+        assert getAuditReader().find(ParentEntity.class, id1, 1).equals(ver1);
+        assert getAuditReader().find(ParentEntity.class, id1, 2).equals(ver2);
+    }
+
+    @Test
+    public void testPolymorphicQuery() {
+        ChildEntity childVer1 = new ChildEntity(id1, "x", 1l);
+
+        assert getAuditReader().createQuery().forEntitiesAtRevision(ChildEntity.class, 1).getSingleResult()
+                .equals(childVer1);
+
+        assert getAuditReader().createQuery().forEntitiesAtRevision(ParentEntity.class, 1).getSingleResult()
+                .equals(childVer1);
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,78 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class ChildEntity extends ParentEntity {
+    @Basic
+    private Long number;
+
+    public ChildEntity() {
+    }
+
+    public ChildEntity(Integer id, String data, Long number) {
+        super(id, data);
+        this.number = number;
+    }
+
+    public Long getNumber() {
+        return number;
+    }
+
+    public void setNumber(Long number) {
+        this.number = number;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ChildEntity)) return false;
+        if (!super.equals(o)) return false;
+
+        ChildEntity childEntity = (ChildEntity) o;
+
+        if (number != null ? !number.equals(childEntity.number) : childEntity.number != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (number != null ? number.hashCode() : 0);
+        return result;
+    }
+
+    public String toString() {
+        return "ChildEntity(id = " + getId() + ", data = " + getData() + ", number = " + number + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,95 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ParentAuditing extends AbstractEntityTest {
+    private Integer id1;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(ChildEntity.class);
+        cfg.addAnnotatedClass(ParentEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+
+        id1 = 1;
+
+        // Rev 1
+        em.getTransaction().begin();
+        ParentEntity pe = new ParentEntity(id1, "x");
+        em.persist(pe);
+        em.getTransaction().commit();
+
+        // Rev 2
+        em.getTransaction().begin();
+        pe = em.find(ParentEntity.class, id1);
+        pe.setData("y");
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(ParentEntity.class, id1));
+    }
+
+    @Test
+    public void testHistoryOfChildId1() {
+        assert getAuditReader().find(ChildEntity.class, id1, 1) == null;
+        assert getAuditReader().find(ChildEntity.class, id1, 2) == null;
+    }
+
+    @Test
+    public void testHistoryOfParentId1() {
+        ParentEntity ver1 = new ParentEntity(id1, "x");
+        ParentEntity ver2 = new ParentEntity(id1, "y");
+
+        assert getAuditReader().find(ParentEntity.class, id1, 1).equals(ver1);
+        assert getAuditReader().find(ParentEntity.class, id1, 2).equals(ver2);
+    }
+
+    @Test
+    public void testPolymorphicQuery() {
+        ParentEntity parentVer1 = new ParentEntity(id1, "x");
+
+        assert getAuditReader().createQuery().forEntitiesAtRevision(ParentEntity.class, 1).getSingleResult()
+                .equals(parentVer1);
+        assert getAuditReader().createQuery().forEntitiesAtRevision(ChildEntity.class, 1)
+                .getResultList().size() == 0;
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,94 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at Audited
+public class ParentEntity {
+    @Id
+    private Integer id;
+
+    @Basic
+    private String data;
+
+    public ParentEntity() {
+    }
+
+    public ParentEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ParentEntity)) return false;
+
+        ParentEntity that = (ParentEntity) o;
+
+        if (data != null ? !data.equals(that.data) : that.data != null) return false;
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result;
+        result = (id != null ? id.hashCode() : 0);
+        result = 31 * result + (data != null ? data.hashCode() : 0);
+        return result;
+    }
+
+    public String toString() {
+        return "ParentEntity(id = " + getId() + ", data = " + getData() + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,90 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.childrelation;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class ChildIngEntity extends ParentNotIngEntity {
+    @Basic
+    private Long number;
+
+    @ManyToOne
+    private ReferencedEntity referenced;
+
+    public ChildIngEntity() {
+    }
+
+    public ChildIngEntity(Integer id, String data, Long number) {
+        super(id, data);
+        this.number = number;
+    }
+
+    public Long getNumber() {
+        return number;
+    }
+
+    public void setNumber(Long number) {
+        this.number = number;
+    }
+
+    public ReferencedEntity getReferenced() {
+        return referenced;
+    }
+
+    public void setReferenced(ReferencedEntity referenced) {
+        this.referenced = referenced;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ChildIngEntity)) return false;
+        if (!super.equals(o)) return false;
+
+        ChildIngEntity childEntity = (ChildIngEntity) o;
+
+        if (number != null ? !number.equals(childEntity.number) : childEntity.number != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (number != null ? number.hashCode() : 0);
+        return result;
+    }
+
+    public String toString() {
+        return "ChildIngEntity(id = " + getId() + ", data = " + getData() + ", number = " + number + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,124 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.childrelation;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.tools.TestTools;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ChildReferencing extends AbstractEntityTest {
+    private Integer re_id1;
+    private Integer re_id2;
+    private Integer c_id;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(ChildIngEntity.class);
+        cfg.addAnnotatedClass(ParentNotIngEntity.class);
+        cfg.addAnnotatedClass(ReferencedEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+
+        re_id1 = 1;
+        re_id2 = 10;
+        c_id = 100;
+
+        // Rev 1
+        em.getTransaction().begin();
+
+        ReferencedEntity re1 = new ReferencedEntity(re_id1);
+        em.persist(re1);
+
+        ReferencedEntity re2 = new ReferencedEntity(re_id2);
+        em.persist(re2);
+
+        em.getTransaction().commit();
+
+        // Rev 2
+        em.getTransaction().begin();
+
+        re1 = em.find(ReferencedEntity.class, re_id1);
+
+        ChildIngEntity cie = new ChildIngEntity(c_id, "y", 1l);
+        cie.setReferenced(re1);
+        em.persist(cie);
+        c_id = cie.getId();
+
+        em.getTransaction().commit();
+
+        // Rev 3
+        em.getTransaction().begin();
+
+        re2 = em.find(ReferencedEntity.class, re_id2);
+        cie = em.find(ChildIngEntity.class, c_id);
+
+        cie.setReferenced(re2);
+
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2, 3).equals(getAuditReader().getRevisions(ReferencedEntity.class, re_id1));
+        assert Arrays.asList(1, 3).equals(getAuditReader().getRevisions(ReferencedEntity.class, re_id2));
+        assert Arrays.asList(2, 3).equals(getAuditReader().getRevisions(ChildIngEntity.class, c_id));
+    }
+
+    @Test
+    public void testHistoryOfReferencedCollection1() {
+        assert getAuditReader().find(ReferencedEntity.class, re_id1, 1).getReferencing().size() == 0;
+        assert getAuditReader().find(ReferencedEntity.class, re_id1, 2).getReferencing().equals(
+                TestTools.makeSet(new ChildIngEntity(c_id, "y", 1l)));
+        assert getAuditReader().find(ReferencedEntity.class, re_id1, 3).getReferencing().size() == 0;
+    }
+
+    @Test
+    public void testHistoryOfReferencedCollection2() {
+        assert getAuditReader().find(ReferencedEntity.class, re_id2, 1).getReferencing().size() == 0;
+        assert getAuditReader().find(ReferencedEntity.class, re_id2, 2).getReferencing().size() == 0;
+        assert getAuditReader().find(ReferencedEntity.class, re_id2, 3).getReferencing().equals(
+                TestTools.makeSet(new ChildIngEntity(c_id, "y", 1l)));
+    }
+
+    @Test
+    public void testChildHistory() {
+        assert getAuditReader().find(ChildIngEntity.class, c_id, 1) == null;
+        assert getAuditReader().find(ChildIngEntity.class, c_id, 2).getReferenced().equals(
+                new ReferencedEntity(re_id1));
+        assert getAuditReader().find(ChildIngEntity.class, c_id, 3).getReferenced().equals(
+                new ReferencedEntity(re_id2));
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,94 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.childrelation;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at Audited
+public class ParentNotIngEntity {
+    @Id
+    private Integer id;
+
+    @Basic
+    private String data;
+
+    public ParentNotIngEntity() {
+    }
+
+    public ParentNotIngEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ParentNotIngEntity)) return false;
+
+        ParentNotIngEntity that = (ParentNotIngEntity) o;
+
+        if (data != null ? !data.equals(that.data) : that.data != null) return false;
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result;
+        result = (id != null ? id.hashCode() : 0);
+        result = 31 * result + (data != null ? data.hashCode() : 0);
+        return result;
+    }
+
+    public String toString() {
+        return "ParentNotIngEntity(id = " + getId() + ", data = " + getData() + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,87 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.childrelation;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class ReferencedEntity {
+    @Id
+    private Integer id;
+
+    @OneToMany(mappedBy = "referenced")
+    private Set<ChildIngEntity> referencing;
+
+    public ReferencedEntity(Integer id) {
+        this.id = id;
+    }
+
+    public ReferencedEntity() {
+    }
+
+    public Set<ChildIngEntity> getReferencing() {
+        return referencing;
+    }
+
+    public void setReferencing(Set<ChildIngEntity> referencing) {
+        this.referencing = referencing;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ReferencedEntity)) return false;
+
+        ReferencedEntity that = (ReferencedEntity) o;
+
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        return id;
+    }
+
+    public String toString() {
+        return "ReferencedEntity(id = " + getId() + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,100 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.notownedrelation;
+
+import org.hibernate.envers.Audited;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+ at Entity
+ at Audited
+public class Address implements Serializable {
+	@Id
+	private Long id;
+
+	private String address1;
+
+	@ManyToOne
+	private Contact contact;
+
+    public Address() {
+    }
+
+    public Address(Long id, String address1) {
+        this.id = id;
+        this.address1 = address1;
+    }
+
+    public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getAddress1() {
+		return address1;
+	}
+
+	public void setAddress1(String address1) {
+		this.address1 = address1;
+	}
+
+	public Contact getContact() {
+		return contact;
+	}
+
+	public void setContact(Contact contact) {
+		this.contact = contact;
+	}
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof Address)) return false;
+
+        Address address = (Address) o;
+
+        if (address1 != null ? !address1.equals(address.address1) : address.address1 != null) return false;
+        if (id != null ? !id.equals(address.id) : address.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result;
+        result = (id != null ? id.hashCode() : 0);
+        result = 31 * result + (address1 != null ? address1.hashCode() : 0);
+        return result;
+    }
+
+    public String toString() {
+        return "Address(id = " + getId() + ", address1 = " + getAddress1() + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,77 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.notownedrelation;
+
+import java.io.Serializable;
+import java.util.Set;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.OneToMany;
+
+import org.hibernate.envers.Audited;
+
+ at Entity
+ at Inheritance(strategy=InheritanceType.JOINED)
+ at Audited
+public class Contact implements Serializable {
+    @Id
+    private Long id;
+
+    private String email;
+
+    @OneToMany(mappedBy="contact")
+    private Set<Address> addresses;
+
+    public Contact() {
+    }
+
+    public Contact(Long id, String email) {
+        this.id = id;
+        this.email = email;
+    }
+
+    public Long getId() {
+        return id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+	public String getEmail() {
+        return email;
+    }
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Set<Address> getAddresses() {
+        return addresses;
+    }
+    public void setAddresses(Set<Address> addresses) {
+        this.addresses = addresses;
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,115 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.notownedrelation;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.tools.TestTools;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class NotOwnedBidirectional extends AbstractEntityTest {
+    private Long pc_id;
+    private Long a1_id;
+    private Long a2_id;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(Address.class);
+        cfg.addAnnotatedClass(Contact.class);
+        cfg.addAnnotatedClass(PersonalContact.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+
+        pc_id = 1l;
+        a1_id = 10l;
+        a2_id = 100l;
+
+        // Rev 1
+        em.getTransaction().begin();
+
+        PersonalContact pc = new PersonalContact(pc_id, "e", "f");
+
+        Address a1 = new Address(a1_id, "a1");
+        a1.setContact(pc);
+
+        em.persist(pc);
+        em.persist(a1);
+
+        em.getTransaction().commit();
+
+        // Rev 2
+        em.getTransaction().begin();
+
+        pc = em.find(PersonalContact.class, pc_id);
+
+        Address a2 = new Address(a2_id, "a2");
+        a2.setContact(pc);
+
+        em.persist(a2);
+
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(Contact.class, pc_id));
+        assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(PersonalContact.class, pc_id));
+
+        assert Arrays.asList(1).equals(getAuditReader().getRevisions(Address.class, a1_id));
+        assert Arrays.asList(1).equals(getAuditReader().getRevisions(Address.class, a1_id));
+
+        assert Arrays.asList(2).equals(getAuditReader().getRevisions(Address.class, a2_id));
+        assert Arrays.asList(2).equals(getAuditReader().getRevisions(Address.class, a2_id));
+    }
+
+    @Test
+    public void testHistoryOfContact() {
+        assert getAuditReader().find(Contact.class, pc_id, 1).getAddresses().equals(
+                TestTools.makeSet(new Address(a1_id, "a1")));
+
+        assert getAuditReader().find(Contact.class, pc_id, 2).getAddresses().equals(
+                TestTools.makeSet(new Address(a1_id, "a1"), new Address(a2_id, "a2")));
+    }
+
+    @Test
+    public void testHistoryOfPersonalContact() {
+        System.out.println(getAuditReader().find(PersonalContact.class, pc_id, 1).getAddresses());
+        assert getAuditReader().find(PersonalContact.class, pc_id, 1).getAddresses().equals(
+                TestTools.makeSet(new Address(a1_id, "a1")));
+
+        assert getAuditReader().find(PersonalContact.class, pc_id, 2).getAddresses().equals(
+                TestTools.makeSet(new Address(a1_id, "a1"), new Address(a2_id, "a2")));
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,51 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.notownedrelation;
+
+import javax.persistence.Entity;
+
+import org.hibernate.envers.Audited;
+
+ at Entity
+ at Audited
+public class PersonalContact extends Contact {
+    private String firstname;
+
+    public PersonalContact() {
+    }
+
+    public PersonalContact(Long id, String email, String firstname) {
+        super(id, email);
+        this.firstname = firstname;
+    }
+
+    public String getFirstname() {
+		return firstname;
+	}
+
+    public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,78 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.relation;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class ChildIngEntity extends ParentIngEntity {
+    @Basic
+    private Long number;
+
+    public ChildIngEntity() {
+    }
+
+    public ChildIngEntity(Integer id, String data, Long number) {
+        super(id, data);
+        this.number = number;
+    }
+
+    public Long getNumber() {
+        return number;
+    }
+
+    public void setNumber(Long number) {
+        this.number = number;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ChildIngEntity)) return false;
+        if (!super.equals(o)) return false;
+
+        ChildIngEntity childEntity = (ChildIngEntity) o;
+
+        if (number != null ? !number.equals(childEntity.number) : childEntity.number != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result = super.hashCode();
+        result = 31 * result + (number != null ? number.hashCode() : 0);
+        return result;
+    }
+
+    public String toString() {
+        return "ChildIngEntity(id = " + getId() + ", data = " + getData() + ", number = " + number + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,106 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.relation;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at Audited
+public class ParentIngEntity {
+    @Id
+    private Integer id;
+
+    @Basic
+    private String data;
+
+    @ManyToOne
+    private ReferencedEntity referenced;
+
+    public ParentIngEntity() {
+    }
+
+    public ParentIngEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public ReferencedEntity getReferenced() {
+        return referenced;
+    }
+
+    public void setReferenced(ReferencedEntity referenced) {
+        this.referenced = referenced;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ParentIngEntity)) return false;
+
+        ParentIngEntity that = (ParentIngEntity) o;
+
+        if (data != null ? !data.equals(that.data) : that.data != null) return false;
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result;
+        result = (id != null ? id.hashCode() : 0);
+        result = 31 * result + (data != null ? data.hashCode() : 0);
+        return result;
+    }
+
+    public String toString() {
+        return "ParentIngEntity(id = " + getId() + ", data = " + getData() + ")";
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,107 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.relation;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.tools.TestTools;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class PolymorphicCollection extends AbstractEntityTest {
+    private Integer ed_id1;
+    private Integer c_id;
+    private Integer p_id;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(ChildIngEntity.class);
+        cfg.addAnnotatedClass(ParentIngEntity.class);
+        cfg.addAnnotatedClass(ReferencedEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+
+        ed_id1 = 1;
+        p_id = 10;
+        c_id = 100;
+
+        // Rev 1
+        em.getTransaction().begin();
+
+        ReferencedEntity re = new ReferencedEntity(ed_id1);
+        em.persist(re);
+
+        em.getTransaction().commit();
+
+        // Rev 2
+        em.getTransaction().begin();
+
+        re = em.find(ReferencedEntity.class, ed_id1);
+
+        ParentIngEntity pie = new ParentIngEntity(p_id,"x");
+        pie.setReferenced(re);
+        em.persist(pie);
+        p_id = pie.getId();
+
+        em.getTransaction().commit();
+
+        // Rev 3
+        em.getTransaction().begin();
+
+        re = em.find(ReferencedEntity.class, ed_id1);
+
+        ChildIngEntity cie = new ChildIngEntity(c_id, "y", 1l);
+        cie.setReferenced(re);
+        em.persist(cie);
+        c_id = cie.getId();
+
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2, 3).equals(getAuditReader().getRevisions(ReferencedEntity.class, ed_id1));
+        assert Arrays.asList(2).equals(getAuditReader().getRevisions(ParentIngEntity.class, p_id));
+        assert Arrays.asList(3).equals(getAuditReader().getRevisions(ChildIngEntity.class, c_id));
+    }
+
+    @Test
+    public void testHistoryOfReferencedCollection() {
+        assert getAuditReader().find(ReferencedEntity.class, ed_id1, 1).getReferencing().size() == 0;
+        assert getAuditReader().find(ReferencedEntity.class, ed_id1, 2).getReferencing().equals(
+                TestTools.makeSet(new ParentIngEntity(p_id, "x")));
+        assert getAuditReader().find(ReferencedEntity.class, ed_id1, 3).getReferencing().equals(
+                TestTools.makeSet(new ParentIngEntity(p_id, "x"), new ChildIngEntity(c_id, "y", 1l)));
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java	2008-11-17 07:19:44 UTC (rev 15571)
@@ -0,0 +1,87 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.inheritance.joined.relation;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class ReferencedEntity {
+    @Id
+    private Integer id;
+
+    @OneToMany(mappedBy = "referenced")
+    private Set<ParentIngEntity> referencing;
+
+    public ReferencedEntity() {
+    }
+
+    public ReferencedEntity(Integer id) {
+        this.id = id;
+    }
+
+    public Set<ParentIngEntity> getReferencing() {
+        return referencing;
+    }
+
+    public void setReferencing(Set<ParentIngEntity> referencing) {
+        this.referencing = referencing;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ReferencedEntity)) return false;
+
+        ReferencedEntity that = (ReferencedEntity) o;
+
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        return id;
+    }
+
+    public String toString() {
+        return "ReferencedEntity(id = " + getId() + ")";
+    }
+}
\ No newline at end of file

Modified: core/trunk/envers/src/test/resources/testng.xml
===================================================================
--- core/trunk/envers/src/test/resources/testng.xml	2008-11-16 16:48:22 UTC (rev 15570)
+++ core/trunk/envers/src/test/resources/testng.xml	2008-11-17 07:19:44 UTC (rev 15571)
@@ -13,6 +13,10 @@
             <package name="org.hibernate.envers.test.integration.data" />
             <package name="org.hibernate.envers.test.integration.flush" />
             <package name="org.hibernate.envers.test.integration.ids" />
+            <package name="org.hibernate.envers.test.integration.inheritance.joined" />
+            <package name="org.hibernate.envers.test.integration.inheritance.joined.childrelation" />
+            <package name="org.hibernate.envers.test.integration.inheritance.joined.notownedrelation" />
+            <package name="org.hibernate.envers.test.integration.inheritance.joined.relation" />
             <package name="org.hibernate.envers.test.integration.inheritance.single" />
             <package name="org.hibernate.envers.test.integration.inheritance.single.childrelation" />
             <package name="org.hibernate.envers.test.integration.inheritance.single.notownedrelation" />




More information about the hibernate-commits mailing list