/*
* 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.ids.embeddedid;
import java.util.Arrays;
import javax.persistence.EntityManager;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Test avoiding the creating of a foreign key constraint for an embedded identifier that
* contains a many-to-one relationship, allowing the removal of the base table entity
* without throwing a foreign-key constraint exception due to historical audit rows.
*
* @author Chris Cranford
*/
@TestForIssue(jiraKey = "HHH-11107")
public class RelationInsideEmbeddableRemoveTest extends BaseEnversJPAFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { CorrectChild.class, IncorrectChild.class, Parent.class };
}
@Test
@Priority(10)
public void initData() {
EntityManager entityManager = getOrCreateEntityManager();
try {
// Revision 1
entityManager.getTransaction().begin();
Parent parent = new Parent( "Parent" );
parent.addIncorrectChild( 1 );
parent.addCorrectChild( 1 );
entityManager.persist( parent );
for ( IncorrectChild child : parent.getIncorrectChildren() ) {
entityManager.persist( child );
}
for ( CorrectChild child : parent.getCorrectChildren() ) {
entityManager.persist( child );
}
entityManager.getTransaction().commit();
// Revision 2
entityManager.getTransaction().begin();
for ( IncorrectChild child : parent.getIncorrectChildren() ) {
entityManager.remove( child );
}
parent.getIncorrectChildren().clear();
for( CorrectChild child : parent.getCorrectChildren() ) {
entityManager.remove( child );
}
parent.getCorrectChildren().clear();
entityManager.getTransaction().commit();
// Revision 3
// This fails because of referential integrity constraints without fix.
entityManager.getTransaction().begin();
entityManager.remove( parent );
entityManager.getTransaction().commit();
}
catch ( Exception e ) {
if ( entityManager.getTransaction().isActive() ) {
entityManager.getTransaction().rollback();
}
throw e;
}
finally {
entityManager.close();
}
}
@Test
public void testRevisionCounts() {
assertEquals( Arrays.asList( 1, 3 ), getAuditReader().getRevisions( Parent.class, "Parent" ) );
}
}