diff --git a/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/multiplerelations/GroupMemberTest.java b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/multiplerelations/GroupMemberTest.java new file mode 100644 index 0000000000..ccea9b4407 --- /dev/null +++ b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/multiplerelations/GroupMemberTest.java @@ -0,0 +1,203 @@ +/* + * 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.multiplerelations; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; +import javax.persistence.Query; + +import org.hibernate.envers.AuditMappedBy; +import org.hibernate.envers.Audited; +import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; +import org.hibernate.envers.test.Priority; +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.transaction.TransactionUtil; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author Chris Cranford + */ +@TestForIssue(jiraKey = "HHH-7681") +public class GroupMemberTest extends BaseEnversJPAFunctionalTestCase { + private Integer uniqueGroupId; + private Integer groupMemberId; + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { GroupMember.class, MultiGroup.class, UniqueGroup.class }; + } + + @Test + @Priority(10) + public void initData() { + // Revision 1 + TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + final UniqueGroup uniqueGroup = new UniqueGroup(); + final GroupMember groupMember = new GroupMember(); + uniqueGroup.addMember( groupMember ); + entityManager.persist( uniqueGroup ); + entityManager.persist( groupMember ); + uniqueGroupId = uniqueGroup.getId(); + groupMemberId = groupMember.getId(); + } ); + // Revision 2 + TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + final GroupMember groupMember = entityManager.find( GroupMember.class, groupMemberId ); + final MultiGroup multiGroup = new MultiGroup(); + groupMember.addMultiGroup( multiGroup ); + entityManager.persist( multiGroup ); + } ); + } + + @Test + public void testUniqueGroupFound() { + TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + final GroupMember groupMember = entityManager.find( GroupMember.class, groupMemberId ); + assertNotNull( groupMember ); + assertNotNull( groupMember.getUniqueGroup() ); + } ); + } + + @Test + public void testUniqueGroupFromAuditHistory() { + assertEquals( uniqueGroupId, getCurrentAuditUniqueGroupId() ); + } + + private Integer getCurrentAuditUniqueGroupId() { + return TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + final Query query = entityManager.createNativeQuery( + "SELECT uniqueGroup_id FROM groupmember_aud ORDER BY rev DESC" + ).setMaxResults( 1 ); + final Object result = query.getSingleResult(); + assertNotNull( result ); + return (Integer) result; + } ); + } + + @Entity(name = "GroupMember") + @Audited + public static class GroupMember { + @Id + @GeneratedValue + private Integer id; + + @ManyToOne + @JoinColumn(name = "uniqueGroup_id", insertable = false, updatable = false) + private UniqueGroup uniqueGroup; + + @ManyToMany(mappedBy = "members") + private List multiGroups = new ArrayList<>(); + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public UniqueGroup getUniqueGroup() { + return uniqueGroup; + } + + public void setUniqueGroup(UniqueGroup uniqueGroup) { + this.uniqueGroup = uniqueGroup; + } + + public List getMultiGroups() { + return multiGroups; + } + + public void setMultiGroups(List multiGroups) { + this.multiGroups = multiGroups; + } + + public void addMultiGroup(MultiGroup multiGroup) { + this.multiGroups.add( multiGroup ); + multiGroup.addMember( this ); + } + } + + @Entity(name = "UniqueGroup") + @Audited + public static class UniqueGroup { + @Id + @GeneratedValue + private Integer id; + + @OneToMany + @JoinColumn(name = "uniqueGroup_id") + @AuditMappedBy(mappedBy = "uniqueGroup") + private Set members = new HashSet<>(); + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Set getMembers() { + return members; + } + + public void setMembers(Set members) { + this.members = members; + } + + public void addMember(GroupMember groupMember) { + this.members.add( groupMember ); + } + } + + @Entity(name = "MultiGroup") + @Audited + public static class MultiGroup { + @Id + @GeneratedValue + private Integer id; + + @ManyToMany + @OrderColumn + private List members = new ArrayList<>(); + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public void addMember(GroupMember groupMember) { + this.members.add( groupMember ); + } + } +}