mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-16 16:15:06 +00:00
HHH-13080 - Added test case.
This commit is contained in:
parent
a2fe91c490
commit
fc8f6871fd
@ -0,0 +1,309 @@
|
|||||||
|
/*
|
||||||
|
* 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.collection;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.persistence.ElementCollection;
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToMany;
|
||||||
|
|
||||||
|
import org.hibernate.envers.Audited;
|
||||||
|
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
|
||||||
|
import org.hibernate.envers.test.Priority;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-13080")
|
||||||
|
public class DetachedCollectionChangeTest extends BaseEnversJPAFunctionalTestCase {
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "Alert")
|
||||||
|
public static class Alert {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Integer id;
|
||||||
|
@ManyToMany
|
||||||
|
private List<RuleName> ruleNames = new ArrayList<>();
|
||||||
|
@ElementCollection
|
||||||
|
private List<String> names = new ArrayList<>();
|
||||||
|
@ElementCollection
|
||||||
|
private Set<CompositeName> composites = new HashSet<>();
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<RuleName> getRuleNames() {
|
||||||
|
return ruleNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRuleNames(List<RuleName> ruleNames) {
|
||||||
|
this.ruleNames = ruleNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getNames() {
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNames(List<String> names) {
|
||||||
|
this.names = names;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<CompositeName> getComposites() {
|
||||||
|
return composites;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComposites(Set<CompositeName> composites) {
|
||||||
|
this.composites = composites;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Audited
|
||||||
|
@Entity(name = "RuleName")
|
||||||
|
public static class RuleName {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public RuleName() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public RuleName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if ( this == o ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
RuleName ruleName = (RuleName) o;
|
||||||
|
return Objects.equals( id, ruleName.id ) &&
|
||||||
|
Objects.equals( name, ruleName.name );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash( id, name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public static class CompositeName implements Serializable {
|
||||||
|
private String value1;
|
||||||
|
private String value2;
|
||||||
|
|
||||||
|
public CompositeName() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositeName(String value1, String value2) {
|
||||||
|
this.value1 = value1;
|
||||||
|
this.value2 = value2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue1() {
|
||||||
|
return value1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue1(String value1) {
|
||||||
|
this.value1 = value1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue2() {
|
||||||
|
return value2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue2(String value2) {
|
||||||
|
this.value2 = value2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[]{ Alert.class, RuleName.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer ruleName1Id;
|
||||||
|
private Integer ruleName2Id;
|
||||||
|
private Integer alertId;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(10)
|
||||||
|
public void initData() {
|
||||||
|
EntityManager em = getEntityManager();
|
||||||
|
|
||||||
|
RuleName ruleName1 = new RuleName();
|
||||||
|
RuleName ruleName2 = new RuleName();
|
||||||
|
|
||||||
|
CompositeName compositeName1 = new CompositeName( "First1", "Last1" );
|
||||||
|
CompositeName compositeName2 = new CompositeName( "First2", "Last2" );
|
||||||
|
|
||||||
|
Alert alert = new Alert();
|
||||||
|
alert.getRuleNames().add( ruleName1 );
|
||||||
|
alert.getRuleNames().add( ruleName2 );
|
||||||
|
alert.getNames().add( "N1" );
|
||||||
|
alert.getNames().add( "N2" );
|
||||||
|
alert.getComposites().add( compositeName1 );
|
||||||
|
alert.getComposites().add( compositeName2 );
|
||||||
|
|
||||||
|
// Revision 1
|
||||||
|
em.getTransaction().begin();
|
||||||
|
em.persist( ruleName1 );
|
||||||
|
em.persist( ruleName2 );
|
||||||
|
em.persist( alert );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
alertId = alert.id;
|
||||||
|
ruleName1Id = ruleName1.id;
|
||||||
|
ruleName2Id = ruleName2.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(9)
|
||||||
|
public void testRevisionsCounts() {
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Alert.class, alertId ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName1Id ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName2Id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(8)
|
||||||
|
public void testClearAndAddWithinTransactionDoesNotChangeAnything() {
|
||||||
|
EntityManager em = getEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
|
||||||
|
final Alert alert = em.find( Alert.class, alertId );
|
||||||
|
|
||||||
|
List<RuleName> ruleNamesClone = new ArrayList<>( alert.getRuleNames() );
|
||||||
|
List<String> namesClone = new ArrayList<>( alert.getNames() );
|
||||||
|
List<CompositeName> compositeNamesClones = new ArrayList<>( alert.getComposites() );
|
||||||
|
|
||||||
|
alert.getRuleNames().clear();
|
||||||
|
alert.getRuleNames().addAll( ruleNamesClone );
|
||||||
|
|
||||||
|
alert.getNames().clear();
|
||||||
|
alert.getNames().addAll( namesClone );
|
||||||
|
|
||||||
|
alert.getComposites().clear();
|
||||||
|
alert.getComposites().addAll( compositeNamesClones );
|
||||||
|
|
||||||
|
em.persist( alert );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Alert.class, alertId ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName1Id ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName2Id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(7)
|
||||||
|
public void testClearAddDetachedOutsideTransaction() {
|
||||||
|
EntityManager em = getEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
|
||||||
|
final RuleName ruleName1 = em.find( RuleName.class, ruleName1Id );
|
||||||
|
final RuleName ruleName2 = em.find( RuleName.class, ruleName2Id );
|
||||||
|
|
||||||
|
final CompositeName compositeName1 = new CompositeName( "First1", "Last1" );
|
||||||
|
final CompositeName compositeName2 = new CompositeName( "First2", "Last2" );
|
||||||
|
|
||||||
|
List<RuleName> ruleNamesClone = Arrays.asList( ruleName1, ruleName2 );
|
||||||
|
List<String> namesClone = Arrays.asList( "N1", "N2" );
|
||||||
|
List<CompositeName> compositeNamesClone = Arrays.asList( compositeName1, compositeName2 );
|
||||||
|
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Alert alert = em.find( Alert.class, alertId );
|
||||||
|
|
||||||
|
alert.getRuleNames().clear();
|
||||||
|
alert.getRuleNames().addAll( ruleNamesClone );
|
||||||
|
|
||||||
|
alert.getNames().clear();
|
||||||
|
alert.getNames().addAll( namesClone );
|
||||||
|
|
||||||
|
alert.getComposites().clear();
|
||||||
|
alert.getComposites().addAll( compositeNamesClone );
|
||||||
|
|
||||||
|
em.persist( alert );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( Alert.class, alertId ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName1Id ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName2Id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Priority(6)
|
||||||
|
public void testClearAddOneWithinTransaction() {
|
||||||
|
EntityManager em = getEntityManager();
|
||||||
|
em.getTransaction().begin();
|
||||||
|
|
||||||
|
Alert alert = em.find( Alert.class, alertId );
|
||||||
|
|
||||||
|
List<RuleName> ruleNamesClone = new ArrayList<>( alert.getRuleNames() );
|
||||||
|
List<String> namesClone = new ArrayList<>( alert.getNames() );
|
||||||
|
List<CompositeName> compositeNamesClones = new ArrayList<>( alert.getComposites() );
|
||||||
|
|
||||||
|
alert.getRuleNames().clear();
|
||||||
|
alert.getRuleNames().add( ruleNamesClone.get( 0 ) );
|
||||||
|
|
||||||
|
alert.getNames().clear();
|
||||||
|
alert.getNames().add( namesClone.get( 0 ) );
|
||||||
|
|
||||||
|
alert.getComposites().clear();
|
||||||
|
alert.getComposites().add( compositeNamesClones.get( 0 ) );
|
||||||
|
|
||||||
|
em.persist( alert );
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
Assert.assertEquals( Arrays.asList( 1, 2 ), getAuditReader().getRevisions( Alert.class, alertId ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName1Id ) );
|
||||||
|
Assert.assertEquals( Arrays.asList( 1 ), getAuditReader().getRevisions( RuleName.class, ruleName2Id ) );
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user