/*
* 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.modifiedflags;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.dialect.Oracle8iDialect;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.entities.collection.MultipleCollectionEntity;
import org.hibernate.envers.test.entities.collection.MultipleCollectionRefEntity1;
import org.hibernate.envers.test.entities.collection.MultipleCollectionRefEntity2;
import org.hibernate.testing.SkipForDialect;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import static org.hibernate.envers.test.tools.TestTools.extractRevisionNumbers;
import static org.hibernate.envers.test.tools.TestTools.makeList;
import static org.junit.Assert.assertEquals;
/**
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
@TestForIssue(jiraKey = "HHH-7437")
@SkipForDialect(value = Oracle8iDialect.class,
comment = "Oracle does not support identity key generation")
public class HasChangedDetachedMultipleCollection extends AbstractModifiedFlagsEntityTest {
private Long mce1Id = null;
private Long mce2Id = null;
private Long mcre1Id = null;
private Long mcre2Id = null;
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
MultipleCollectionEntity.class, MultipleCollectionRefEntity1.class, MultipleCollectionRefEntity2.class
};
}
@Test
@Priority(10)
public void initData() {
EntityManager em = getEntityManager();
// Revision 1 - addition.
em.getTransaction().begin();
MultipleCollectionEntity mce1 = new MultipleCollectionEntity();
mce1.setText( "MultipleCollectionEntity-1-1" );
em.persist( mce1 ); // Persisting entity with empty collections.
em.getTransaction().commit();
mce1Id = mce1.getId();
// Revision 2 - update.
em.getTransaction().begin();
mce1 = em.find( MultipleCollectionEntity.class, mce1.getId() );
MultipleCollectionRefEntity1 mcre1 = new MultipleCollectionRefEntity1();
mcre1.setText( "MultipleCollectionRefEntity1-1-1" );
mcre1.setMultipleCollectionEntity( mce1 );
mce1.addRefEntity1( mcre1 );
em.persist( mcre1 );
mce1 = em.merge( mce1 );
em.getTransaction().commit();
mcre1Id = mcre1.getId();
// No changes.
em.getTransaction().begin();
mce1 = em.find( MultipleCollectionEntity.class, mce1.getId() );
mce1 = em.merge( mce1 );
em.getTransaction().commit();
em.close();
em = getEntityManager();
// Revision 3 - updating detached collection.
em.getTransaction().begin();
mce1.removeRefEntity1( mcre1 );
mce1 = em.merge( mce1 );
em.getTransaction().commit();
em.close();
em = getEntityManager();
// Revision 4 - updating detached entity, no changes to collection attributes.
em.getTransaction().begin();
mce1.setRefEntities1( new ArrayList<MultipleCollectionRefEntity1>() );
mce1.setRefEntities2( new ArrayList<MultipleCollectionRefEntity2>() );
mce1.setText( "MultipleCollectionEntity-1-2" );
mce1 = em.merge( mce1 );
em.getTransaction().commit();
em.close();
em = getEntityManager();
// No changes to detached entity (collections were empty before).
em.getTransaction().begin();
mce1.setRefEntities1( new ArrayList<MultipleCollectionRefEntity1>() );
mce1.setRefEntities2( new ArrayList<MultipleCollectionRefEntity2>() );
mce1 = em.merge( mce1 );
em.getTransaction().commit();
// Revision 5 - addition.
em.getTransaction().begin();
MultipleCollectionEntity mce2 = new MultipleCollectionEntity();
mce2.setText( "MultipleCollectionEntity-2-1" );
MultipleCollectionRefEntity2 mcre2 = new MultipleCollectionRefEntity2();
mcre2.setText( "MultipleCollectionRefEntity2-1-1" );
mcre2.setMultipleCollectionEntity( mce2 );
mce2.addRefEntity2( mcre2 );
em.persist( mce2 ); // Cascade persisting related entity.
em.getTransaction().commit();
mce2Id = mce2.getId();
mcre2Id = mcre2.getId();
em.close();
}
@Test
public void testHasChanged() {
List list = queryForPropertyHasChanged( MultipleCollectionEntity.class, mce1Id, "text" );
assertEquals( 2, list.size() );
assertEquals( makeList( 1, 4 ), extractRevisionNumbers( list ) );
list = queryForPropertyHasChanged( MultipleCollectionEntity.class, mce1Id, "refEntities1" );
assertEquals( 3, list.size() );
assertEquals( makeList( 1, 2, 3 ), extractRevisionNumbers( list ) );
list = queryForPropertyHasChanged( MultipleCollectionEntity.class, mce1Id, "refEntities2" );
assertEquals( 1, list.size() );
assertEquals( makeList( 1 ), extractRevisionNumbers( list ) );
list = queryForPropertyHasChanged( MultipleCollectionRefEntity1.class, mcre1Id, "text" );
assertEquals( 1, list.size() );
assertEquals( makeList( 2 ), extractRevisionNumbers( list ) );
list = queryForPropertyHasChanged( MultipleCollectionEntity.class, mce2Id, "text" );
assertEquals( 1, list.size() );
assertEquals( makeList( 5 ), extractRevisionNumbers( list ) );
list = queryForPropertyHasChanged( MultipleCollectionEntity.class, mce2Id, "refEntities2" );
assertEquals( 1, list.size() );
assertEquals( makeList( 5 ), extractRevisionNumbers( list ) );
list = queryForPropertyHasChanged( MultipleCollectionRefEntity2.class, mcre2Id, "text" );
assertEquals( 1, list.size() );
assertEquals( makeList( 5 ), extractRevisionNumbers( list ) );
}
}