HHH-7681 - Envers test case.

This commit is contained in:
Chris Cranford 2016-06-16 15:37:20 -05:00
parent cc21eeb1af
commit 16fd531b6a
1 changed files with 203 additions and 0 deletions

View File

@ -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 <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
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<MultiGroup> 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<MultiGroup> getMultiGroups() {
return multiGroups;
}
public void setMultiGroups(List<MultiGroup> 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<GroupMember> members = new HashSet<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Set<GroupMember> getMembers() {
return members;
}
public void setMembers(Set<GroupMember> 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<GroupMember> members = new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public List<GroupMember> getMembers() {
return members;
}
public void setMembers(List<GroupMember> members) {
this.members = members;
}
public void addMember(GroupMember groupMember) {
this.members.add( groupMember );
}
}
}