From f5253722a4fc8b45b7b86bb886c83bed9886e554 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Mon, 17 Nov 2008 07:19:44 +0000 Subject: [PATCH] HHH-3564: support for joined inheritance with tests git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@15571 1b8cb986-b30d-0410-93ca-fae66ebed9b2 --- .../metadata/AuditMetadataGenerator.java | 8 +- .../inheritance/joined/ChildAuditing.java | 94 +++++++++++++ .../inheritance/joined/ChildEntity.java | 78 +++++++++++ .../inheritance/joined/ParentAuditing.java | 95 ++++++++++++++ .../inheritance/joined/ParentEntity.java | 94 +++++++++++++ .../joined/childrelation/ChildIngEntity.java | 90 +++++++++++++ .../childrelation/ChildReferencing.java | 124 ++++++++++++++++++ .../childrelation/ParentNotIngEntity.java | 94 +++++++++++++ .../childrelation/ReferencedEntity.java | 87 ++++++++++++ .../joined/notownedrelation/Address.java | 100 ++++++++++++++ .../joined/notownedrelation/Contact.java | 77 +++++++++++ .../NotOwnedBidirectional.java | 115 ++++++++++++++++ .../notownedrelation/PersonalContact.java | 51 +++++++ .../joined/relation/ChildIngEntity.java | 78 +++++++++++ .../joined/relation/ParentIngEntity.java | 106 +++++++++++++++ .../relation/PolymorphicCollection.java | 107 +++++++++++++++ .../joined/relation/ReferencedEntity.java | 87 ++++++++++++ envers/src/test/resources/testng.xml | 4 + 18 files changed, 1488 insertions(+), 1 deletion(-) create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java create mode 100644 envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java diff --git a/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java b/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java index c0c6798f36..bd074ff918 100644 --- a/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java +++ b/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java @@ -293,7 +293,13 @@ public void generateFirstPass(PersistentClass pc, PersistentClassAuditingData au 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"); diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java new file mode 100644 index 0000000000..21f8646b07 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildAuditing.java @@ -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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java new file mode 100644 index 0000000000..1da99e85f0 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ChildEntity.java @@ -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) + */ +@Entity +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java new file mode 100644 index 0000000000..d36f3ee803 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentAuditing.java @@ -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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java new file mode 100644 index 0000000000..aa0c98460d --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/ParentEntity.java @@ -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) + */ +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java new file mode 100644 index 0000000000..c853fa54f4 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildIngEntity.java @@ -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) + */ +@Entity +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java new file mode 100644 index 0000000000..1b846e5468 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ChildReferencing.java @@ -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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java new file mode 100644 index 0000000000..5c20f04a02 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ParentNotIngEntity.java @@ -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) + */ +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java new file mode 100644 index 0000000000..1596365d41 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/childrelation/ReferencedEntity.java @@ -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) + */ +@Entity +@Audited +public class ReferencedEntity { + @Id + private Integer id; + + @OneToMany(mappedBy = "referenced") + private Set referencing; + + public ReferencedEntity(Integer id) { + this.id = id; + } + + public ReferencedEntity() { + } + + public Set getReferencing() { + return referencing; + } + + public void setReferencing(Set 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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java new file mode 100644 index 0000000000..1cc532f072 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Address.java @@ -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; + +@Entity +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java new file mode 100644 index 0000000000..311781b5af --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/Contact.java @@ -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; + +@Entity +@Inheritance(strategy=InheritanceType.JOINED) +@Audited +public class Contact implements Serializable { + @Id + private Long id; + + private String email; + + @OneToMany(mappedBy="contact") + private Set
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
getAddresses() { + return addresses; + } + public void setAddresses(Set
addresses) { + this.addresses = addresses; + } +} \ No newline at end of file diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java new file mode 100644 index 0000000000..3ae53da442 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/NotOwnedBidirectional.java @@ -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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java new file mode 100644 index 0000000000..e141d28de8 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/notownedrelation/PersonalContact.java @@ -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; + +@Entity +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java new file mode 100644 index 0000000000..507734cad2 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ChildIngEntity.java @@ -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) + */ +@Entity +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java new file mode 100644 index 0000000000..66a71a4de5 --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ParentIngEntity.java @@ -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) + */ +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +@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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java new file mode 100644 index 0000000000..6e66075a3c --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/PolymorphicCollection.java @@ -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 diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java new file mode 100644 index 0000000000..0e4d16035f --- /dev/null +++ b/envers/src/test/java/org/hibernate/envers/test/integration/inheritance/joined/relation/ReferencedEntity.java @@ -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) + */ +@Entity +@Audited +public class ReferencedEntity { + @Id + private Integer id; + + @OneToMany(mappedBy = "referenced") + private Set referencing; + + public ReferencedEntity() { + } + + public ReferencedEntity(Integer id) { + this.id = id; + } + + public Set getReferencing() { + return referencing; + } + + public void setReferencing(Set 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 diff --git a/envers/src/test/resources/testng.xml b/envers/src/test/resources/testng.xml index e300955bc5..c2e6f7f139 100644 --- a/envers/src/test/resources/testng.xml +++ b/envers/src/test/resources/testng.xml @@ -13,6 +13,10 @@ + + + +