From 8f6800e97fba0a647cc6f7b6743392ccd08addda Mon Sep 17 00:00:00 2001 From: Chris Cranford Date: Wed, 24 Jan 2018 11:04:18 -0500 Subject: [PATCH] HHH-12440 - Added test case. --- .../MappedByEmbeddableAttributeTest.java | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 hibernate-envers/src/test/java/org/hibernate/envers/test/integration/manytomany/MappedByEmbeddableAttributeTest.java diff --git a/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/manytomany/MappedByEmbeddableAttributeTest.java b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/manytomany/MappedByEmbeddableAttributeTest.java new file mode 100644 index 000000000000..9f801dec601f --- /dev/null +++ b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/manytomany/MappedByEmbeddableAttributeTest.java @@ -0,0 +1,219 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.envers.test.integration.manytomany; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.persistence.Embeddable; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToMany; + +import org.hibernate.envers.AuditReader; +import org.hibernate.envers.Audited; +import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; +import org.hibernate.envers.test.Priority; +import org.junit.Test; + +import org.hibernate.testing.TestForIssue; + +import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; +import static org.junit.Assert.assertEquals; + +/** + * @author Chris Cranford + */ +@TestForIssue(jiraKey = "HHH-12240") +public class MappedByEmbeddableAttributeTest extends BaseEnversJPAFunctionalTestCase { + + @Audited + @Entity(name = "EntityA") + public static class EntityA { + @Id + @GeneratedValue + private Integer id; + private String name; + @Embedded + private Container container; + + EntityA() { + + } + + EntityA(String name) { + this( name, new Container() ); + } + + EntityA(String name, Container container) { + this.name = name; + this.container = container; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Container getContainer() { + return container; + } + + public void setContainer(Container container) { + this.container = container; + } + } + + @Embeddable + public static class Container { + @ManyToMany + private List bList = new ArrayList<>(); + + public List getbList() { + return bList; + } + + public void setbList(List bList) { + this.bList = bList; + } + } + + @Audited + @Entity(name = "EntityB") + public static class EntityB { + @Id + @GeneratedValue + private Integer id; + private String name; + @ManyToMany(mappedBy = "container.bList") + private List aList = new ArrayList<>(); + + EntityB() { + + } + + EntityB(String name, EntityA... objects) { + this.name = name; + if ( objects.length > 0 ) { + for ( EntityA a : objects ) { + this.aList.add( a ); + a.getContainer().getbList().add( this ); + } + } + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getaList() { + return aList; + } + + public void setaList(List aList) { + this.aList = aList; + } + } + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { EntityA.class, EntityB.class }; + } + + private Integer aId; + private Integer bId1; + private Integer bId2; + + @Test + @Priority(10) + public void initData() { + doInJPA( this::entityManagerFactory, entityManager -> { + final EntityA a = new EntityA( "A" ); + final EntityB b = new EntityB( "B", a ); + entityManager.persist( a ); + entityManager.persist( b ); + + this.aId = a.getId(); + this.bId1 = b.getId(); + } ); + + doInJPA( this::entityManagerFactory, entityManager -> { + final EntityA a = entityManager.find( EntityA.class, this.aId ); + for ( EntityB b : a.getContainer().getbList() ) { + b.setName( b.getName() + "-Updated" ); + entityManager.merge( b ); + } + } ); + + doInJPA( this::entityManagerFactory, entityManager -> { + final EntityA a = entityManager.find( EntityA.class, this.aId ); + final EntityB b = new EntityB( "B2", a ); + entityManager.persist( b ); + entityManager.merge( a ); + + this.bId2 = b.getId(); + } ); + } + + @Test + public void testRevisionHistoryEntityA() { + List aRevisions = getAuditReader().getRevisions( EntityA.class, this.aId ); + assertEquals( Arrays.asList( 1, 3 ), aRevisions ); + + EntityA rev1 = getAuditReader().find( EntityA.class, this.aId, 1 ); + assertEquals( 1, rev1.getContainer().getbList().size() ); + assertEquals( "B", rev1.getContainer().getbList().get( 0 ).getName() ); + + EntityA rev3 = getAuditReader().find( EntityA.class, this.aId, 3 ); + assertEquals( 2, rev3.getContainer().getbList().size() ); + assertEquals( "B-Updated", rev3.getContainer().getbList().get( 0 ).getName() ); + assertEquals( "B2", rev3.getContainer().getbList().get( 1 ).getName() ); + + } + + @Test + public void testRevisionHistoryEntityB() { + List b1Revisions = getAuditReader().getRevisions( EntityB.class, this.bId1 ); + assertEquals( Arrays.asList( 1, 2 ), b1Revisions ); + + EntityB b1Rev1 = getAuditReader().find( EntityB.class, this.bId1, 1 ); + assertEquals( "B", b1Rev1.getName() ); + assertEquals( 1, b1Rev1.getaList().size() ); + assertEquals( this.aId, b1Rev1.getaList().get( 0 ).getId() ); + + EntityB b1Rev2 = getAuditReader().find( EntityB.class, this.bId1, 2 ); + assertEquals( "B-Updated", b1Rev2.getName() ); + assertEquals( 1, b1Rev1.getaList().size() ); + assertEquals( this.aId, b1Rev1.getaList().get( 0 ).getId() ); + + List b2Revisions = getAuditReader().getRevisions( EntityB.class, this.bId2 ); + assertEquals( Arrays.asList( 3 ), b2Revisions ); + + EntityB b2Rev3 = getAuditReader().find( EntityB.class, this.bId2, 3 ); + assertEquals( "B2", b2Rev3.getName() ); + assertEquals( 1, b2Rev3.getaList().size() ); + assertEquals( this.aId, b2Rev3.getaList().get( 0 ).getId() ); + } +}