Re-enabled additional tests
This commit is contained in:
parent
96f8273673
commit
96be013089
|
@ -0,0 +1,391 @@
|
|||
/*
|
||||
* 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.orm.test.orphan;
|
||||
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.internal.util.SerializationHelper;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/**
|
||||
* @author Gavin King
|
||||
*/
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/Product.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class OrphanTest {
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from Part" ).executeUpdate();
|
||||
session.createQuery( "delete from Product" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteOnDelete(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Product prod = new Product();
|
||||
prod.setName( "Widget" );
|
||||
Part part = new Part();
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
session.flush();
|
||||
|
||||
prod.getParts().remove( part );
|
||||
|
||||
session.delete( prod );
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNull( session.get( Part.class, "Get" ) );
|
||||
assertNull( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteAfterPersist(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Product prod = new Product();
|
||||
prod.setName( "Widget" );
|
||||
Part part = new Part();
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
|
||||
prod.getParts().remove( part );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNotNull( session.get( Part.class, "Get" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteAfterPersistAndFlush(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Product prod = new Product();
|
||||
prod.setName( "Widget" );
|
||||
Part part = new Part();
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
session.flush();
|
||||
|
||||
prod.getParts().remove( part );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNotNull( session.get( Part.class, "Get" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteAfterLock(SessionFactoryScope scope) {
|
||||
Product prod = new Product();
|
||||
Part part = new Part();
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
prod.setName( "Widget" );
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.lock( prod, LockMode.READ );
|
||||
prod.getParts().remove( part );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNotNull( session.get( Part.class, "Get" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteOnSaveOrUpdate(SessionFactoryScope scope) {
|
||||
Product prod = new Product();
|
||||
Part part = new Part();
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
prod.setName( "Widget" );
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
}
|
||||
);
|
||||
|
||||
prod.getParts().remove( part );
|
||||
|
||||
scope.inTransaction(
|
||||
session ->
|
||||
session.saveOrUpdate( prod )
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNotNull( session.get( Part.class, "Get" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteOnSaveOrUpdateAfterSerialization(SessionFactoryScope scope) {
|
||||
Product prod = new Product();
|
||||
Part part = new Part();
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
prod.setName( "Widget" );
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
}
|
||||
);
|
||||
|
||||
prod.getParts().remove( part );
|
||||
|
||||
Product cloned = (Product) SerializationHelper.clone( prod );
|
||||
|
||||
scope.inTransaction(
|
||||
session ->
|
||||
session.saveOrUpdate( cloned )
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNotNull( session.get( Part.class, "Get" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDelete(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Product prod = new Product();
|
||||
prod.setName( "Widget" );
|
||||
Part part = new Part();
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
}
|
||||
);
|
||||
|
||||
scope.getSessionFactory().getCache().evictEntityData( Product.class );
|
||||
scope.getSessionFactory().getCache().evictEntityData( Part.class );
|
||||
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Product prod = session.get( Product.class, "Widget" );
|
||||
assertTrue( Hibernate.isInitialized( prod.getParts() ) );
|
||||
Part part = session.get( Part.class, "Widge" );
|
||||
prod.getParts().remove( part );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNotNull( session.get( Part.class, "Get" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteOnMerge(SessionFactoryScope scope) {
|
||||
Product prod = new Product();
|
||||
Part part = new Part();
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
prod.setName( "Widget" );
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
Part part2 = new Part();
|
||||
part2.setName( "Get" );
|
||||
part2.setDescription( "another part if a Widget" );
|
||||
prod.getParts().add( part2 );
|
||||
session.persist( prod );
|
||||
}
|
||||
);
|
||||
|
||||
prod.getParts().remove( part );
|
||||
|
||||
scope.inTransaction(
|
||||
session ->
|
||||
session.merge( prod )
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
assertNotNull( session.get( Part.class, "Get" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
public void testOrphanDeleteOnMergeRemoveElementMerge(SessionFactoryScope scope) {
|
||||
Product prod = new Product();
|
||||
Part part = new Part();
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
prod.setName( "Widget" );
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
session.persist( prod );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.merge( prod );
|
||||
prod.getParts().remove( part );
|
||||
session.merge( prod );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings({ "unchecked" })
|
||||
@TestForIssue(jiraKey = "HHH-9171")
|
||||
public void testOrphanDeleteOnAddElementMergeRemoveElementMerge(SessionFactoryScope scope) {
|
||||
Product prod = new Product();
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
prod.setName( "Widget" );
|
||||
session.persist( prod );
|
||||
}
|
||||
);
|
||||
|
||||
Part part = new Part();
|
||||
part.setName( "Widge" );
|
||||
part.setDescription( "part if a Widget" );
|
||||
prod.getParts().add( part );
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.merge( prod );
|
||||
// In Section 2.9, Entity Relationships, the JPA 2.1 spec says:
|
||||
// "If the entity being orphaned is a detached, new, or removed entity,
|
||||
// the semantics of orphanRemoval do not apply."
|
||||
// In other words, since part is a new entity, it will not be deleted when removed
|
||||
// from prod.parts, even though cascade for the association includes "delete-orphan".
|
||||
prod.getParts().remove( part );
|
||||
session.merge( prod );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
assertNotNull( session.get( Part.class, "Widge" ) );
|
||||
session.delete( session.get( Product.class, "Widget" ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
//$Id: Part.java 5725 2005-02-14 12:10:15Z oneovthafew $
|
||||
package org.hibernate.test.orphan;
|
||||
package org.hibernate.orm.test.orphan;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
-->
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan">
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan">
|
||||
|
||||
<class name="Product" table="t_product">
|
||||
<id name="name"/>
|
|
@ -6,7 +6,8 @@
|
|||
*/
|
||||
|
||||
//$Id: Product.java 5725 2005-02-14 12:10:15Z oneovthafew $
|
||||
package org.hibernate.test.orphan;
|
||||
package org.hibernate.orm.test.orphan;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
|
@ -0,0 +1,58 @@
|
|||
package org.hibernate.orm.test.orphan.elementcollection;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@TestForIssue(jiraKey = "HHH-14597")
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/elementcollection/student.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class ElementCollectionOrphanTest {
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from Student" ).executeUpdate();
|
||||
session.createQuery( "delete from EnrollableClass" ).executeUpdate();
|
||||
session.createQuery( "delete from EnrolledClassSeat" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setCompositeElementTest(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
EnrollableClass aClass = new EnrollableClass();
|
||||
aClass.setId( "123" );
|
||||
aClass.setName( "Math" );
|
||||
session.save( aClass );
|
||||
|
||||
Student aStudent = new Student();
|
||||
aStudent.setId( "s1" );
|
||||
aStudent.setFirstName( "John" );
|
||||
aStudent.setLastName( "Smith" );
|
||||
|
||||
EnrolledClassSeat seat = new EnrolledClassSeat();
|
||||
seat.setId( "seat1" );
|
||||
seat.setRow( 10 );
|
||||
seat.setColumn( 5 );
|
||||
|
||||
StudentEnrolledClass enrClass = new StudentEnrolledClass();
|
||||
enrClass.setEnrolledClass( aClass );
|
||||
enrClass.setClassStartTime( 130 );
|
||||
enrClass.setSeat( seat );
|
||||
aStudent.setEnrolledClasses( Collections.singleton( enrClass ) );
|
||||
session.save( aStudent );
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package org.hibernate.test.orphan.elementcollection;
|
||||
package org.hibernate.orm.test.orphan.elementcollection;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
|
@ -1,4 +1,4 @@
|
|||
package org.hibernate.test.orphan.elementcollection;
|
||||
package org.hibernate.orm.test.orphan.elementcollection;
|
||||
|
||||
public class EnrolledClassSeat {
|
||||
private String id;
|
|
@ -1,4 +1,4 @@
|
|||
package org.hibernate.test.orphan.elementcollection;
|
||||
package org.hibernate.orm.test.orphan.elementcollection;
|
||||
|
||||
import java.util.Set;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.hibernate.test.orphan.elementcollection;
|
||||
package org.hibernate.orm.test.orphan.elementcollection;
|
||||
|
||||
public class StudentEnrolledClass {
|
||||
private EnrollableClass enrolledClass;
|
|
@ -5,7 +5,7 @@
|
|||
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
|
||||
|
||||
<hibernate-mapping>
|
||||
<class name="org.hibernate.test.orphan.elementcollection.Student" table="STUDENT" lazy="true" >
|
||||
<class name="org.hibernate.orm.test.orphan.elementcollection.Student" table="STUDENT" lazy="true" >
|
||||
|
||||
<id name="id" column="id">
|
||||
<generator class="assigned"/>
|
||||
|
@ -17,17 +17,17 @@
|
|||
<set name="enrolledClasses" table="STUDENT_CLASS" lazy="true" fetch="subselect" cascade="all">
|
||||
<key column="STUDENT_ID" />
|
||||
|
||||
<composite-element class="org.hibernate.test.orphan.elementcollection.StudentEnrolledClass" >
|
||||
<many-to-one class="org.hibernate.test.orphan.elementcollection.EnrollableClass" name="enrolledClass"
|
||||
<composite-element class="org.hibernate.orm.test.orphan.elementcollection.StudentEnrolledClass" >
|
||||
<many-to-one class="org.hibernate.orm.test.orphan.elementcollection.EnrollableClass" name="enrolledClass"
|
||||
column="ENROLLED_CLASS_ID" not-null="true" lazy="false" unique="false" cascade="none" />
|
||||
<property name="classStartTime" column="STARTTIME" />
|
||||
<many-to-one class="org.hibernate.test.orphan.elementcollection.EnrolledClassSeat" name="seat"
|
||||
<many-to-one class="org.hibernate.orm.test.orphan.elementcollection.EnrolledClassSeat" name="seat"
|
||||
column="ENROLLED_CLASS_SEAT_ID" not-null="true" lazy="false" unique="true" cascade="all-delete-orphan" />
|
||||
</composite-element>
|
||||
</set>
|
||||
</class>
|
||||
|
||||
<class name="org.hibernate.test.orphan.elementcollection.EnrollableClass" lazy="true" >
|
||||
<class name="org.hibernate.orm.test.orphan.elementcollection.EnrollableClass" lazy="true" >
|
||||
|
||||
<id name="id" column="id">
|
||||
<generator class="assigned"/>
|
||||
|
@ -35,7 +35,7 @@
|
|||
<property name="name" column="NAME" />
|
||||
</class>
|
||||
|
||||
<class name="org.hibernate.test.orphan.elementcollection.EnrolledClassSeat" lazy="true" >
|
||||
<class name="org.hibernate.orm.test.orphan.elementcollection.EnrolledClassSeat" lazy="true" >
|
||||
<id name="id" column="id">
|
||||
<generator class="assigned"/>
|
||||
</id>
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.manytomany;
|
||||
package org.hibernate.orm.test.orphan.manytomany;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
|
@ -4,29 +4,41 @@
|
|||
* 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.test.orphan.manytomany;
|
||||
package org.hibernate.orm.test.orphan.manytomany;
|
||||
|
||||
import java.util.List;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class ManyToManyOrphanTest extends BaseCoreFunctionalTestCase {
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/manytomany/UserGroup.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class ManyToManyOrphanTest {
|
||||
|
||||
@Override
|
||||
protected String[] getMappings() {
|
||||
return new String[] { "orphan/manytomany/UserGroup.hbm.xml" };
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from User" ).executeUpdate();
|
||||
session.createQuery( "delete from Group" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-8749")
|
||||
public void testManyToManyWithCascadeDeleteOrphan() {
|
||||
inTransaction(
|
||||
public void testManyToManyWithCascadeDeleteOrphan(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
s -> {
|
||||
User bob = new User( "bob", "jboss" );
|
||||
Group seam = new Group( "seam", "jboss" );
|
||||
|
@ -41,7 +53,7 @@ public class ManyToManyOrphanTest extends BaseCoreFunctionalTestCase {
|
|||
}
|
||||
);
|
||||
|
||||
inTransaction(
|
||||
scope.inTransaction(
|
||||
s -> {
|
||||
User b = s.get( User.class, "bob" );
|
||||
assertEquals( 2, b.getGroups().size() );
|
||||
|
@ -52,7 +64,7 @@ public class ManyToManyOrphanTest extends BaseCoreFunctionalTestCase {
|
|||
}
|
||||
);
|
||||
|
||||
inTransaction(
|
||||
scope.inTransaction(
|
||||
s -> {
|
||||
User b = s.get( User.class, "bob" );
|
||||
assertEquals( 2, b.getGroups().size() );
|
||||
|
@ -62,7 +74,7 @@ public class ManyToManyOrphanTest extends BaseCoreFunctionalTestCase {
|
|||
}
|
||||
);
|
||||
|
||||
inTransaction(
|
||||
scope.inTransaction(
|
||||
s -> {
|
||||
User b = s.get( User.class, "bob" );
|
||||
assertEquals( 1, b.getGroups().size() );
|
||||
|
@ -70,7 +82,7 @@ public class ManyToManyOrphanTest extends BaseCoreFunctionalTestCase {
|
|||
);
|
||||
|
||||
// Verify orphan group was deleted
|
||||
inTransaction(
|
||||
scope.inTransaction(
|
||||
s -> {
|
||||
CriteriaBuilder criteriaBuilder = s.getCriteriaBuilder();
|
||||
CriteriaQuery<Group> criteria = criteriaBuilder.createQuery( Group.class );
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.manytomany;
|
||||
package org.hibernate.orm.test.orphan.manytomany;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
|
@ -9,7 +9,7 @@
|
|||
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
||||
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan.manytomany">
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan.manytomany">
|
||||
|
||||
<class name="User" table="`User`">
|
||||
<id name="name" length="32" />
|
|
@ -4,36 +4,52 @@
|
|||
* 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.test.orphan.one2one;
|
||||
package org.hibernate.orm.test.orphan.one2one;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToOne;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@TestForIssue( jiraKey = "HHH-9663" )
|
||||
public class OneToOneEagerNonOptionalOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[] { Car.class, PaintColor.class, Engine.class };
|
||||
@TestForIssue(jiraKey = "HHH-9663")
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
OneToOneEagerNonOptionalOrphanRemovalTest.Car.class,
|
||||
OneToOneEagerNonOptionalOrphanRemovalTest.PaintColor.class,
|
||||
OneToOneEagerNonOptionalOrphanRemovalTest.Engine.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class OneToOneEagerNonOptionalOrphanRemovalTest {
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from Car" ).executeUpdate();
|
||||
session.createQuery( "delete from Engine" ).executeUpdate();
|
||||
session.createQuery( "delete from PaintColor" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneToOneLazyNonOptionalOrphanRemoval() {
|
||||
public void testOneToOneLazyNonOptionalOrphanRemoval(SessionFactoryScope scope) {
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Initialize the data
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final PaintColor color = new PaintColor( 1, "Red" );
|
||||
final Engine engine1 = new Engine( 1, 275 );
|
||||
final Engine engine2 = new Engine( 2, 295 );
|
||||
|
@ -47,14 +63,14 @@ public class OneToOneEagerNonOptionalOrphanRemovalTest extends BaseCoreFunctiona
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for unidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
final Engine engine = session.find( Engine.class, 2 );
|
||||
car.setEngine( engine );
|
||||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNotNull( car.getEngine() );
|
||||
|
||||
|
@ -64,7 +80,7 @@ public class OneToOneEagerNonOptionalOrphanRemovalTest extends BaseCoreFunctiona
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for bidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final PaintColor color = new PaintColor( 2, "Blue" );
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
car.setPaintColor( color );
|
||||
|
@ -72,7 +88,7 @@ public class OneToOneEagerNonOptionalOrphanRemovalTest extends BaseCoreFunctiona
|
|||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNotNull( car.getPaintColor() );
|
||||
|
||||
|
@ -86,6 +102,8 @@ public class OneToOneEagerNonOptionalOrphanRemovalTest extends BaseCoreFunctiona
|
|||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String model;
|
||||
|
||||
// represents a bidirectional one-to-one
|
||||
@OneToOne(orphanRemoval = true, optional = false)
|
||||
private PaintColor paintColor;
|
|
@ -4,36 +4,52 @@
|
|||
* 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.test.orphan.one2one;
|
||||
package org.hibernate.orm.test.orphan.one2one;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToOne;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@TestForIssue( jiraKey = "HHH-9663" )
|
||||
public class OneToOneEagerOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[] { Car.class, PaintColor.class, Engine.class };
|
||||
@TestForIssue(jiraKey = "HHH-9663")
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
OneToOneEagerOrphanRemovalTest.Car.class,
|
||||
OneToOneEagerOrphanRemovalTest.PaintColor.class,
|
||||
OneToOneEagerOrphanRemovalTest.Engine.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class OneToOneEagerOrphanRemovalTest {
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from Car" ).executeUpdate();
|
||||
session.createQuery( "delete from Engine" ).executeUpdate();
|
||||
session.createQuery( "delete from PaintColor" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneToOneEagerOrphanRemoval() {
|
||||
public void testOneToOneEagerOrphanRemoval(SessionFactoryScope scope) {
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Initialize the data
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final PaintColor color = new PaintColor( 1, "Red" );
|
||||
final Engine engine = new Engine( 1, 275 );
|
||||
final Car car = new Car( 1, engine, color );
|
||||
|
@ -45,13 +61,13 @@ public class OneToOneEagerOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for unidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
car.setEngine( null );
|
||||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNull( car.getEngine() );
|
||||
|
||||
|
@ -61,13 +77,13 @@ public class OneToOneEagerOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for bidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
car.setPaintColor( null );
|
||||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNull( car.getPaintColor() );
|
||||
|
||||
|
@ -81,6 +97,8 @@ public class OneToOneEagerOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
|||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String model;
|
||||
|
||||
// represents a bidirectional one-to-one
|
||||
@OneToOne(orphanRemoval = true, fetch = FetchType.EAGER)
|
||||
private PaintColor paintColor;
|
|
@ -4,37 +4,53 @@
|
|||
* 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.test.orphan.one2one;
|
||||
package org.hibernate.orm.test.orphan.one2one;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToOne;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@TestForIssue( jiraKey = "HHH-9663" )
|
||||
public class OneToOneLazyNonOptionalOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[] { Car.class, PaintColor.class, Engine.class };
|
||||
@TestForIssue(jiraKey = "HHH-9663")
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
OneToOneLazyNonOptionalOrphanRemovalTest.Car.class,
|
||||
OneToOneLazyNonOptionalOrphanRemovalTest.PaintColor.class,
|
||||
OneToOneLazyNonOptionalOrphanRemovalTest.Engine.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class OneToOneLazyNonOptionalOrphanRemovalTest {
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from Car" ).executeUpdate();
|
||||
session.createQuery( "delete from Engine" ).executeUpdate();
|
||||
session.createQuery( "delete from PaintColor" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneToOneLazyNonOptionalOrphanRemoval() {
|
||||
public void testOneToOneLazyNonOptionalOrphanRemoval(SessionFactoryScope scope) {
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Initialize the data
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final PaintColor color = new PaintColor( 1, "Red" );
|
||||
final Engine engine1 = new Engine( 1, 275 );
|
||||
final Engine engine2 = new Engine( 2, 295 );
|
||||
|
@ -48,14 +64,14 @@ public class OneToOneLazyNonOptionalOrphanRemovalTest extends BaseCoreFunctional
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for unidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
final Engine engine = session.find( Engine.class, 2 );
|
||||
car.setEngine( engine );
|
||||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNotNull( car.getEngine() );
|
||||
|
||||
|
@ -65,7 +81,7 @@ public class OneToOneLazyNonOptionalOrphanRemovalTest extends BaseCoreFunctional
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for bidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final PaintColor color = new PaintColor( 2, "Blue" );
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
car.setPaintColor( color );
|
||||
|
@ -73,7 +89,7 @@ public class OneToOneLazyNonOptionalOrphanRemovalTest extends BaseCoreFunctional
|
|||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNotNull( car.getPaintColor() );
|
||||
|
||||
|
@ -87,6 +103,8 @@ public class OneToOneLazyNonOptionalOrphanRemovalTest extends BaseCoreFunctional
|
|||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String model;
|
||||
|
||||
// represents a bidirectional one-to-one
|
||||
@OneToOne(orphanRemoval = true, fetch = FetchType.LAZY, optional = false)
|
||||
private PaintColor paintColor;
|
|
@ -4,36 +4,52 @@
|
|||
* 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.test.orphan.one2one;
|
||||
package org.hibernate.orm.test.orphan.one2one;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToOne;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@TestForIssue( jiraKey = "HHH-9663" )
|
||||
public class OneToOneLazyOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[] { Car.class, PaintColor.class, Engine.class };
|
||||
@TestForIssue(jiraKey = "HHH-9663")
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
OneToOneLazyOrphanRemovalTest.Car.class,
|
||||
OneToOneLazyOrphanRemovalTest.PaintColor.class,
|
||||
OneToOneLazyOrphanRemovalTest.Engine.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class OneToOneLazyOrphanRemovalTest {
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope){
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from PaintColor" ).executeUpdate();
|
||||
session.createQuery( "delete from Engine" ).executeUpdate();
|
||||
session.createQuery( "delete from Car" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneToOneLazyOrphanRemoval() {
|
||||
public void testOneToOneLazyOrphanRemoval(SessionFactoryScope scope) {
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Initialize the data
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final PaintColor color = new PaintColor( 1, "Red" );
|
||||
final Engine engine = new Engine( 1, 275 );
|
||||
final Car car = new Car( 1, engine, color );
|
||||
|
@ -45,13 +61,13 @@ public class OneToOneLazyOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for unidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
car.setEngine( null );
|
||||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNull( car.getEngine() );
|
||||
|
||||
|
@ -61,13 +77,13 @@ public class OneToOneLazyOrphanRemovalTest extends BaseCoreFunctionalTestCase {
|
|||
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Test orphan removal for bidirectional relationship
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
car.setPaintColor( null );
|
||||
session.update( car );
|
||||
} );
|
||||
|
||||
doInHibernate( this::sessionFactory, session -> {
|
||||
scope.inTransaction( session -> {
|
||||
final Car car = session.find( Car.class, 1 );
|
||||
assertNull( car.getPaintColor() );
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one;
|
||||
package org.hibernate.orm.test.orphan.one2one;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Entity;
|
||||
|
@ -15,36 +15,46 @@ import javax.persistence.Id;
|
|||
import javax.persistence.OneToOne;
|
||||
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||
import org.hibernate.testing.orm.junit.Jpa;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
/**
|
||||
* A test that shows orphan-removal is triggered when an entity has a lazy one-to-one
|
||||
* mapping with property-based annotations and the getter method unwraps the proxy
|
||||
* inline during invocation leading to constraint violation due to attempted removal
|
||||
* of the associated entity.
|
||||
*
|
||||
* <p>
|
||||
* This test case documents old behavior so that it can be preserved but allowing
|
||||
* us to also maintain the fix for {@code HHH-9663}.
|
||||
*
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@TestForIssue( jiraKey = "HHH-11965" )
|
||||
public class OneToOneProxyOrphanRemovalTest extends BaseEntityManagerFunctionalTestCase {
|
||||
@TestForIssue(jiraKey = "HHH-11965")
|
||||
@Jpa(
|
||||
annotatedClasses = { OneToOneProxyOrphanRemovalTest.Child.class, OneToOneProxyOrphanRemovalTest.Parent.class }
|
||||
)
|
||||
public class OneToOneProxyOrphanRemovalTest {
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[] { Child.class, Parent.class };
|
||||
@AfterEach
|
||||
public void tearDown(EntityManagerFactoryScope scope){
|
||||
scope.inTransaction(
|
||||
entityManager -> {
|
||||
entityManager.createQuery( "delete from Parent" ).executeUpdate();
|
||||
entityManager.createQuery( "delete from Child" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnproxyOneToOneWithCascade() {
|
||||
Integer pId = doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
public void testUnproxyOneToOneWithCascade(EntityManagerFactoryScope scope) {
|
||||
Integer pId = scope.fromTransaction(
|
||||
entityManager -> {
|
||||
Parent p = new Parent();
|
||||
p.setChild( new Child() );
|
||||
entityManager.persist( p );
|
||||
|
@ -61,15 +71,18 @@ public class OneToOneProxyOrphanRemovalTest extends BaseEntityManagerFunctionalT
|
|||
//
|
||||
// In short, no cascade of orphan-removal should be invoked for this scenario, thus avoiding the raised
|
||||
// constraint violation exception.
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
assertNotNull( entityManager.find( Parent.class, pId ) );
|
||||
} );
|
||||
scope.inTransaction(
|
||||
entityManager ->
|
||||
assertNotNull( entityManager.find( Parent.class, pId ) )
|
||||
);
|
||||
}
|
||||
|
||||
@Entity(name = "Child")
|
||||
public static class Child {
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
public Integer getId() {
|
||||
|
@ -84,6 +97,9 @@ public class OneToOneProxyOrphanRemovalTest extends BaseEntityManagerFunctionalT
|
|||
@Entity(name = "Parent")
|
||||
public static class Parent {
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
private Child child;
|
||||
|
||||
@Id
|
||||
|
@ -106,5 +122,4 @@ public class OneToOneProxyOrphanRemovalTest extends BaseEntityManagerFunctionalT
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.fk.bidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/one2one/fk/bidirectional/Mapping.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteOneToOneOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
session.save( emp );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.pk.unidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.bidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.bidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.bidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.bidirectional" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan.one2one.fk.bidirectional" >
|
||||
|
||||
<class name="Employee">
|
||||
<id name="id" type="long" column="id">
|
|
@ -0,0 +1,258 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
Preisregelung.class,
|
||||
Tranche.class,
|
||||
Tranchenmodell.class,
|
||||
X.class,
|
||||
Y.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteMultiLevelOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
Preisregelung preisregelung = new Preisregelung();
|
||||
|
||||
Tranchenmodell tranchenmodell = new Tranchenmodell();
|
||||
|
||||
X x = new X();
|
||||
|
||||
Tranche tranche1 = new Tranche();
|
||||
|
||||
Y y = new Y();
|
||||
|
||||
Tranche tranche2 = new Tranche();
|
||||
|
||||
preisregelung.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.setPreisregelung( preisregelung );
|
||||
|
||||
tranchenmodell.setX( x );
|
||||
x.setTranchenmodell( tranchenmodell );
|
||||
|
||||
tranchenmodell.getTranchen().add( tranche1 );
|
||||
tranche1.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.getTranchen().add( tranche2 );
|
||||
tranche2.setTranchenmodell( tranchenmodell );
|
||||
|
||||
tranche1.setY( y );
|
||||
y.setTranche( tranche1 );
|
||||
|
||||
scope.inTransaction(
|
||||
session ->
|
||||
session.save( preisregelung )
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete Tranche" ).executeUpdate();
|
||||
session.createQuery( "delete Tranchenmodell" ).executeUpdate();
|
||||
session.createQuery( "delete Preisregelung" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9091")
|
||||
public void testDirectAssociationOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Preisregelung p = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
Tranchenmodell tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( 2, tranchenmodell.getTranchen().size() );
|
||||
assertNotNull( tranchenmodell.getTranchen().get( 0 ).getY() );
|
||||
preisregelung.setTranchenmodell( null );
|
||||
return preisregelung;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Preisregelung preisregelung = session.get( Preisregelung.class, p.getId() );
|
||||
assertNull( preisregelung.getTranchenmodell() );
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9091")
|
||||
public void testReplacedDirectAssociationWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
// Create a new Tranchenmodell with new direct and nested associations
|
||||
Tranchenmodell tranchenmodellNew = new Tranchenmodell();
|
||||
X xNew = new X();
|
||||
tranchenmodellNew.setX( xNew );
|
||||
xNew.setTranchenmodell( tranchenmodellNew );
|
||||
Tranche trancheNew = new Tranche();
|
||||
tranchenmodellNew.getTranchen().add( trancheNew );
|
||||
trancheNew.setTranchenmodell( tranchenmodellNew );
|
||||
Y yNew = new Y();
|
||||
trancheNew.setY( yNew );
|
||||
yNew.setTranche( trancheNew );
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
Tranchenmodell tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( 2, tranchenmodell.getTranchen().size() );
|
||||
assertNotNull( tranchenmodell.getTranchen().get( 0 ).getY() );
|
||||
|
||||
|
||||
// Replace with a new Tranchenmodell instance containing new direct and nested associations
|
||||
preisregelung.setTranchenmodell( tranchenmodellNew );
|
||||
tranchenmodellNew.setPreisregelung( preisregelung );
|
||||
}
|
||||
);
|
||||
|
||||
Tranchenmodell t = scope.fromTransaction(
|
||||
session -> {
|
||||
|
||||
List results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
Tranchenmodell tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertEquals( tranchenmodellNew.getId(), tranchenmodell.getId() );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( xNew.getId(), tranchenmodell.getX().getId() );
|
||||
assertEquals( 1, tranchenmodell.getTranchen().size() );
|
||||
assertEquals( trancheNew.getId(), tranchenmodell.getTranchen().get( 0 ).getId() );
|
||||
assertEquals( yNew.getId(), tranchenmodell.getTranchen().get( 0 ).getY().getId() );
|
||||
|
||||
// Replace with a new Tranchenmodell instance with no associations
|
||||
Tranchenmodell tr = new Tranchenmodell();
|
||||
preisregelung.setTranchenmodell( tr );
|
||||
tr.setPreisregelung( preisregelung );
|
||||
return tr;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Tranchenmodell tranchenmodell = (Tranchenmodell) results.get( 0 );
|
||||
assertEquals( t.getId(), tranchenmodell.getId() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
assertEquals( tranchenmodell, preisregelung.getTranchenmodell() );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9091")
|
||||
public void testDirectAndNestedAssociationsOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Preisregelung p = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
Tranchenmodell tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( 2, tranchenmodell.getTranchen().size() );
|
||||
assertNotNull( tranchenmodell.getTranchen().get( 0 ).getY() );
|
||||
preisregelung.setTranchenmodell( null );
|
||||
tranchenmodell.setX( null );
|
||||
tranchenmodell.getTranchen().get( 0 ).setY( null );
|
||||
return preisregelung;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Preisregelung preisregelung = (Preisregelung) session.get(
|
||||
Preisregelung.class,
|
||||
p.getId()
|
||||
);
|
||||
assertNull( preisregelung.getTranchenmodell() );
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Entity;
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.ArrayList;
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.fk.composite;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/one2one/fk/composite/Mapping.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteOneToOneOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( 1L, 1L ) );
|
||||
session.save( emp );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo( 2L, 2L ) );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.bidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.composite;
|
||||
|
||||
|
||||
/**
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.composite;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.composite;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.composite" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan.one2one.fk.composite" >
|
||||
|
||||
<class name="Employee">
|
||||
<id name="id" type="long" column="id">
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.fk.reversed.bidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteOneToOneOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
session.save( emp );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.reversed.bidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.reversed.bidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.reversed.bidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.reversed.bidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.reversed.bidirectional" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan.one2one.fk.reversed.bidirectional" >
|
||||
|
||||
<class name="Employee">
|
||||
<id name="id" type="long" column="id">
|
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
Preisregelung.class,
|
||||
Tranche.class,
|
||||
Tranchenmodell.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteMultiLevelOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
Preisregelung preisregelung = new Preisregelung();
|
||||
preisregelung.setId( 17960L );
|
||||
|
||||
Tranchenmodell tranchenmodell = new Tranchenmodell();
|
||||
tranchenmodell.setId( 1951L );
|
||||
|
||||
Tranche tranche1 = new Tranche();
|
||||
tranche1.setId( 1951L );
|
||||
|
||||
Tranche tranche2 = new Tranche();
|
||||
tranche2.setId( 1952L );
|
||||
|
||||
preisregelung.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.setPreisregelung( preisregelung );
|
||||
|
||||
tranchenmodell.getTranchen().add( tranche1 );
|
||||
tranche1.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.getTranchen().add( tranche2 );
|
||||
tranche2.setTranchenmodell( tranchenmodell );
|
||||
|
||||
scope.inTransaction(
|
||||
session ->
|
||||
session.save( preisregelung )
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete Tranche" ).executeUpdate();
|
||||
session.createQuery( "delete Preisregelung" ).executeUpdate();
|
||||
session.createQuery( "delete Tranchenmodell" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9091")
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Preisregelung p = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
assertNotNull( preisregelung.getTranchenmodell() );
|
||||
preisregelung.setTranchenmodell( null );
|
||||
return preisregelung;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Preisregelung preisregelung = session.get( Preisregelung.class, p.getId() );
|
||||
assertNull( preisregelung.getTranchenmodell() );
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9091")
|
||||
public void testReplacedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Tranchenmodell t = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
assertNotNull( preisregelung.getTranchenmodell() );
|
||||
|
||||
// Replace with a new Tranchenmodell instance
|
||||
Tranchenmodell tranchenmodellNew = new Tranchenmodell();
|
||||
tranchenmodellNew.setId( 1952L );
|
||||
preisregelung.setTranchenmodell( tranchenmodellNew );
|
||||
tranchenmodellNew.setPreisregelung( preisregelung );
|
||||
return tranchenmodellNew;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Tranchenmodell tranchenmodellQueried = (Tranchenmodell) results.get( 0 );
|
||||
assertEquals( t.getId(), tranchenmodellQueried.getId() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung1Queried = (Preisregelung) results.get( 0 );
|
||||
assertEquals( preisregelung1Queried.getTranchenmodell(), tranchenmodellQueried );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Entity;
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.fk.reversed.unidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteOneToOneOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo() );
|
||||
session.save( emp );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-5267")
|
||||
public void testOrphanedWhileDetached(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
//only fails if the object is detached
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
e.setInfo( null );
|
||||
|
||||
//save using the new session (this used to work prior to 3.5.x)
|
||||
session.saveOrUpdate( e );
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
// TODO: If merge was used instead of saveOrUpdate, this would work.
|
||||
// However, re-attachment does not currently support handling orphans.
|
||||
// See HHH-3795
|
||||
// results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
// assertEquals( 0, results.size() );
|
||||
List results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo() );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.reversed.unidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.reversed.unidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.reversed.unidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.fk.reversed.unidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan.one2one.fk.reversed.unidirectional" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan.one2one.fk.reversed.unidirectional" >
|
||||
|
||||
<class name="Employee">
|
||||
<id name="id" type="long" column="id">
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.pk.bidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/one2one/pk/bidirectional/Mapping.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteOneToOneOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
session.save( emp );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = (Employee) session.get( Employee.class, e.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.pk.bidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.pk.bidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.pk.bidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.pk.bidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan.one2one.pk.bidirectional" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan.one2one.pk.bidirectional" >
|
||||
|
||||
<class name="Employee">
|
||||
<id name="id" type="long" column="id">
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.one2one.pk.unidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@DomainModel(
|
||||
xmlMappings = "org/hibernate/orm/test/orphan/one2one/pk/unidirectional/Mapping.hbm.xml"
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteOneToOneOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = new Employee();
|
||||
session.save( emp );
|
||||
emp.setInfo( new EmployeeInfo( emp.getId() ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Employee e = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
results = session.createQuery( "from Employee e, EmployeeInfo i where e.info = i" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Object[] result = (Object[]) results.get( 0 );
|
||||
emp = (Employee) result[0];
|
||||
assertNotNull( result[1] );
|
||||
assertSame( emp.getInfo(), result[1] );
|
||||
emp.setInfo( null );
|
||||
return emp;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Employee emp = session.get( Employee.class, e.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.fk.composite;
|
||||
package org.hibernate.orm.test.orphan.one2one.pk.unidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.one2one.pk.unidirectional;
|
||||
package org.hibernate.orm.test.orphan.one2one.pk.unidirectional;
|
||||
|
||||
|
||||
/**
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan.one2one.pk.unidirectional" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan.one2one.pk.unidirectional" >
|
||||
|
||||
<class name="Employee">
|
||||
<id name="id" type="long" column="id">
|
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
* 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.orm.test.orphan.onetomany;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Gail Badnmer
|
||||
*/
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
Product.class,
|
||||
Feature.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class DeleteOneToManyOrphansTest {
|
||||
|
||||
@BeforeEach
|
||||
public void createData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Feature newFeature = new Feature();
|
||||
newFeature.setName( "Feature 1" );
|
||||
session.persist( newFeature );
|
||||
|
||||
Product product = new Product();
|
||||
newFeature.setProduct( product );
|
||||
product.getFeatures().add( newFeature );
|
||||
session.persist( product );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void cleanupData(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete Feature" ).executeUpdate();
|
||||
session.createQuery( "delete Product" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9330")
|
||||
public void testOrphanedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Product p = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product product = (Product) results.get( 0 );
|
||||
assertEquals( 1, product.getFeatures().size() );
|
||||
product.getFeatures().clear();
|
||||
return product;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Product product = ( session.get( Product.class, p.getId() ) );
|
||||
assertEquals( 0, product.getFeatures().size() );
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9330")
|
||||
public void testOrphanedWhileManagedMergeOwner(SessionFactoryScope scope) {
|
||||
|
||||
Product p = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product product = (Product) results.get( 0 );
|
||||
assertEquals( 1, product.getFeatures().size() );
|
||||
product.getFeatures().clear();
|
||||
session.merge( product );
|
||||
return product;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Product product = session.get( Product.class, p.getId() );
|
||||
assertEquals( 0, product.getFeatures().size() );
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-9330")
|
||||
public void testReplacedWhileManaged(SessionFactoryScope scope) {
|
||||
|
||||
Feature f = scope.fromTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product product = (Product) results.get( 0 );
|
||||
assertEquals( 1, product.getFeatures().size() );
|
||||
|
||||
// Replace with a new Feature instance
|
||||
product.getFeatures().remove( 0 );
|
||||
Feature featureNew = new Feature();
|
||||
featureNew.setName( "Feature 2" );
|
||||
featureNew.setProduct( product );
|
||||
product.getFeatures().add( featureNew );
|
||||
session.persist( featureNew );
|
||||
return featureNew;
|
||||
}
|
||||
);
|
||||
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Feature featureQueried = (Feature) results.get( 0 );
|
||||
assertEquals( f.getId(), featureQueried.getId() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product productQueried = (Product) results.get( 0 );
|
||||
assertEquals( 1, productQueried.getFeatures().size() );
|
||||
assertEquals( featureQueried, productQueried.getFeatures().get( 0 ) );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.onetomany;
|
||||
package org.hibernate.orm.test.orphan.onetomany;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
|
@ -4,7 +4,7 @@
|
|||
* 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.test.orphan.onetomany;
|
||||
package org.hibernate.orm.test.orphan.onetomany;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan" >
|
||||
|
||||
<class name="Mail" table="t_mail">
|
||||
|
||||
|
|
|
@ -1,386 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.Transaction;
|
||||
import org.hibernate.internal.util.SerializationHelper;
|
||||
import org.hibernate.testing.FailureExpected;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* @author Gavin King
|
||||
*/
|
||||
public class OrphanTest extends BaseCoreFunctionalTestCase {
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/Product.hbm.xml" };
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteOnDelete() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
session.flush();
|
||||
|
||||
prod.getParts().remove(part);
|
||||
|
||||
session.delete(prod);
|
||||
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNull( session.get(Part.class, "Get") );
|
||||
assertNull( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteAfterPersist() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
|
||||
prod.getParts().remove(part);
|
||||
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNotNull( session.get(Part.class, "Get") );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteAfterPersistAndFlush() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
session.flush();
|
||||
|
||||
prod.getParts().remove(part);
|
||||
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNotNull( session.get(Part.class, "Get") );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteAfterLock() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
session.lock( prod, LockMode.READ );
|
||||
prod.getParts().remove(part);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNotNull( session.get(Part.class, "Get") );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteOnSaveOrUpdate() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
prod.getParts().remove(part);
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
session.saveOrUpdate(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNotNull( session.get(Part.class, "Get") );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteOnSaveOrUpdateAfterSerialization() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
prod.getParts().remove(part);
|
||||
|
||||
prod = (Product) SerializationHelper.clone( prod );
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
session.saveOrUpdate(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNotNull( session.get(Part.class, "Get") );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDelete() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
sessionFactory().getCache().evictEntityRegion( Product.class );
|
||||
sessionFactory().getCache().evictEntityRegion( Part.class );
|
||||
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
prod = (Product) session.get(Product.class, "Widget");
|
||||
assertTrue( Hibernate.isInitialized( prod.getParts() ) );
|
||||
part = (Part) session.get(Part.class, "Widge");
|
||||
prod.getParts().remove(part);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNotNull( session.get(Part.class, "Get") );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteOnMerge() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName("Widget");
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
Part part2 = new Part();
|
||||
part2.setName("Get");
|
||||
part2.setDescription("another part if a Widget");
|
||||
prod.getParts().add(part2);
|
||||
session.persist(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
prod.getParts().remove(part);
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
session.merge(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get(Part.class, "Widge") );
|
||||
assertNotNull( session.get(Part.class, "Get") );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public void testOrphanDeleteOnMergeRemoveElementMerge() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName( "Widget" );
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
session.persist(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
session.merge(prod);
|
||||
prod.getParts().remove( part );
|
||||
session.merge( prod );
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNull( session.get( Part.class, "Widge" ) );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
@TestForIssue(jiraKey = "HHH-9171")
|
||||
public void testOrphanDeleteOnAddElementMergeRemoveElementMerge() {
|
||||
Session session = openSession();
|
||||
Transaction t = session.beginTransaction();
|
||||
Product prod = new Product();
|
||||
prod.setName( "Widget" );
|
||||
session.persist(prod);
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
Part part = new Part();
|
||||
part.setName("Widge");
|
||||
part.setDescription("part if a Widget");
|
||||
prod.getParts().add(part);
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
session.merge(prod);
|
||||
// In Section 2.9, Entity Relationships, the JPA 2.1 spec says:
|
||||
// "If the entity being orphaned is a detached, new, or removed entity,
|
||||
// the semantics of orphanRemoval do not apply."
|
||||
// In other words, since part is a new entity, it will not be deleted when removed
|
||||
// from prod.parts, even though cascade for the association includes "delete-orphan".
|
||||
prod.getParts().remove(part);
|
||||
session.merge( prod );
|
||||
t.commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
t = session.beginTransaction();
|
||||
assertNotNull( session.get( Part.class, "Widge" ) );
|
||||
session.delete( session.get(Product.class, "Widget") );
|
||||
t.commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -7,24 +7,40 @@
|
|||
package org.hibernate.test.orphan;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@TestForIssue(jiraKey = "HHH-565")
|
||||
public class PropertyRefTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/User.hbm.xml", "orphan/Mail.hbm.xml" };
|
||||
@DomainModel(
|
||||
xmlMappings = {
|
||||
"org/hibernate/test/orphan/User.hbm.xml",
|
||||
"org/hibernate/test/orphan/Mail.hbm.xml"
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
public class PropertyRefTest {
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from Mail" ).executeUpdate();
|
||||
session.createQuery( "delete from User" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteParentWithBidirOrphanDeleteCollectionBasedOnPropertyRef() {
|
||||
public void testDeleteParentWithBidirOrphanDeleteCollectionBasedOnPropertyRef(SessionFactoryScope scope) {
|
||||
User user = new User( "test" );
|
||||
inTransaction(
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
user.addMail( "test" );
|
||||
user.addMail( "test" );
|
||||
|
@ -32,22 +48,21 @@ public class PropertyRefTest extends BaseCoreFunctionalTestCase {
|
|||
}
|
||||
);
|
||||
|
||||
inTransaction(
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
User u = session.load( User.class, user.getId() );
|
||||
session.delete( u );
|
||||
}
|
||||
);
|
||||
|
||||
inTransaction(
|
||||
s -> {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from Mail where alias = :alias" )
|
||||
.setParameter( "alias", "test" )
|
||||
.executeUpdate();
|
||||
session.createQuery( "delete from User where userid = :userid" )
|
||||
.setParameter( "userid", "test" )
|
||||
.executeUpdate();
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
|
||||
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
|
||||
|
||||
<hibernate-mapping package="org.hibernate.test.orphan" >
|
||||
<hibernate-mapping package="org.hibernate.orm.test.orphan" >
|
||||
|
||||
<class name="User" table="t_user">
|
||||
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
package org.hibernate.test.orphan.elementcollection;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.hibernate.boot.Metadata;
|
||||
import org.hibernate.boot.MetadataSources;
|
||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.hibernate.testing.transaction.TransactionUtil;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
@TestForIssue(jiraKey = "HHH-14597")
|
||||
public class ElementCollectionOrphanTest extends BaseCoreFunctionalTestCase {
|
||||
|
||||
@Override
|
||||
protected String[] getMappings() {
|
||||
return new String[] { "orphan/elementcollection/student.hbm.xml" };
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setCompositeElementTest() {
|
||||
TransactionUtil.doInHibernate(
|
||||
this::sessionFactory,
|
||||
session -> {
|
||||
EnrollableClass aClass = new EnrollableClass();
|
||||
aClass.setId("123");
|
||||
aClass.setName("Math");
|
||||
session.save(aClass);
|
||||
|
||||
Student aStudent = new Student();
|
||||
aStudent.setId("s1");
|
||||
aStudent.setFirstName("John");
|
||||
aStudent.setLastName("Smith");
|
||||
|
||||
EnrolledClassSeat seat = new EnrolledClassSeat();
|
||||
seat.setId("seat1");
|
||||
seat.setRow(10);
|
||||
seat.setColumn(5);
|
||||
|
||||
StudentEnrolledClass enrClass = new StudentEnrolledClass();
|
||||
enrClass.setEnrolledClass(aClass);
|
||||
enrClass.setClassStartTime(130);
|
||||
enrClass.setSeat(seat);
|
||||
aStudent.setEnrolledClasses(Collections.singleton(enrClass));
|
||||
session.save(aStudent);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,112 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.fk.bidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DeleteOneToOneOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/one2one/fk/bidirectional/Mapping.hbm.xml" };
|
||||
}
|
||||
|
||||
private void createData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
session.save( emp );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = ( Employee ) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = ( Employee ) session.get( Employee.class, emp.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = (Employee) session.get( Employee.class, emp.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
}
|
|
@ -1,261 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.fk.bidirectional.multilevelcascade;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class DeleteMultiLevelOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
|
||||
private void createData() {
|
||||
Preisregelung preisregelung = new Preisregelung();
|
||||
|
||||
Tranchenmodell tranchenmodell = new Tranchenmodell();
|
||||
|
||||
X x = new X();
|
||||
|
||||
Tranche tranche1 = new Tranche();
|
||||
|
||||
Y y = new Y();
|
||||
|
||||
Tranche tranche2 = new Tranche();
|
||||
|
||||
preisregelung.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.setPreisregelung( preisregelung );
|
||||
|
||||
tranchenmodell.setX( x );
|
||||
x.setTranchenmodell( tranchenmodell );
|
||||
|
||||
tranchenmodell.getTranchen().add( tranche1 );
|
||||
tranche1.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.getTranchen().add( tranche2 );
|
||||
tranche2.setTranchenmodell( tranchenmodell );
|
||||
|
||||
tranche1.setY( y );
|
||||
y.setTranche( tranche1 );
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.save( preisregelung );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete Tranche" ).executeUpdate();
|
||||
session.createQuery( "delete Tranchenmodell" ).executeUpdate();
|
||||
session.createQuery( "delete Preisregelung" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9091")
|
||||
public void testDirectAssociationOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = ( Preisregelung ) results.get( 0 );
|
||||
Tranchenmodell tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( 2, tranchenmodell.getTranchen().size() );
|
||||
assertNotNull( tranchenmodell.getTranchen().get( 0 ).getY() );
|
||||
preisregelung.setTranchenmodell( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
|
||||
preisregelung = ( Preisregelung ) session.get( Preisregelung.class, preisregelung.getId() );
|
||||
assertNull( preisregelung.getTranchenmodell() );
|
||||
results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9091")
|
||||
public void testReplacedDirectAssociationWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = ( Preisregelung ) results.get( 0 );
|
||||
Tranchenmodell tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( 2, tranchenmodell.getTranchen().size() );
|
||||
assertNotNull( tranchenmodell.getTranchen().get( 0 ).getY() );
|
||||
|
||||
// Create a new Tranchenmodell with new direct and nested associations
|
||||
Tranchenmodell tranchenmodellNew = new Tranchenmodell();
|
||||
X xNew = new X();
|
||||
tranchenmodellNew.setX( xNew );
|
||||
xNew.setTranchenmodell( tranchenmodellNew );
|
||||
Tranche trancheNew = new Tranche();
|
||||
tranchenmodellNew.getTranchen().add( trancheNew );
|
||||
trancheNew.setTranchenmodell( tranchenmodellNew );
|
||||
Y yNew = new Y();
|
||||
trancheNew.setY( yNew );
|
||||
yNew.setTranche( trancheNew );
|
||||
|
||||
// Replace with a new Tranchenmodell instance containing new direct and nested associations
|
||||
preisregelung.setTranchenmodell(tranchenmodellNew );
|
||||
tranchenmodellNew.setPreisregelung( preisregelung );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.getTransaction().begin();
|
||||
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
preisregelung = ( Preisregelung ) results.get( 0 );
|
||||
tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertEquals( tranchenmodellNew.getId(), tranchenmodell.getId() );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( xNew.getId(), tranchenmodell.getX().getId() );
|
||||
assertEquals( 1, tranchenmodell.getTranchen().size() );
|
||||
assertEquals( trancheNew.getId(), tranchenmodell.getTranchen().get( 0 ).getId() );
|
||||
assertEquals( yNew.getId(), tranchenmodell.getTranchen().get( 0 ).getY().getId() );
|
||||
|
||||
// Replace with a new Tranchenmodell instance with no associations
|
||||
tranchenmodellNew = new Tranchenmodell();
|
||||
preisregelung.setTranchenmodell(tranchenmodellNew );
|
||||
tranchenmodellNew.setPreisregelung( preisregelung );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
tranchenmodell = (Tranchenmodell) results.get( 0 );
|
||||
assertEquals( tranchenmodellNew.getId(), tranchenmodell.getId() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
preisregelung = (Preisregelung) results.get( 0 );
|
||||
assertEquals( tranchenmodell, preisregelung.getTranchenmodell() );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9091")
|
||||
public void testDirectAndNestedAssociationsOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = ( Preisregelung ) results.get( 0 );
|
||||
Tranchenmodell tranchenmodell = preisregelung.getTranchenmodell();
|
||||
assertNotNull( tranchenmodell );
|
||||
assertNotNull( tranchenmodell.getX() );
|
||||
assertEquals( 2, tranchenmodell.getTranchen().size() );
|
||||
assertNotNull( tranchenmodell.getTranchen().get( 0 ).getY() );
|
||||
preisregelung.setTranchenmodell( null );
|
||||
tranchenmodell.setX( null );
|
||||
tranchenmodell.getTranchen().get( 0 ).setY( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
|
||||
preisregelung = ( Preisregelung ) session.get( Preisregelung.class, preisregelung.getId() );
|
||||
assertNull( preisregelung.getTranchenmodell() );
|
||||
results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from X" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Y" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class[]{
|
||||
Preisregelung.class,
|
||||
Tranche.class,
|
||||
Tranchenmodell.class,
|
||||
X.class,
|
||||
Y.class
|
||||
};
|
||||
}
|
||||
|
||||
}
|
|
@ -1,112 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.fk.composite;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DeleteOneToOneOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/one2one/fk/composite/Mapping.hbm.xml" };
|
||||
}
|
||||
|
||||
private void createData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( 1L, 1L) );
|
||||
session.save( emp );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = ( Employee ) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = ( Employee ) session.get( Employee.class, emp.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo( 2L, 2L ) );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = (Employee) session.get( Employee.class, emp.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.fk.reversed.bidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DeleteOneToOneOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/one2one/fk/reversed/bidirectional/Mapping.hbm.xml" };
|
||||
}
|
||||
|
||||
private void createData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
session.save( emp );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = ( Employee ) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = ( Employee ) session.get( Employee.class, emp.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = (Employee) session.get( Employee.class, emp.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
}
|
|
@ -1,148 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.fk.reversed.bidirectional.multilevelcascade;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
* @author Gail Badner
|
||||
*/
|
||||
public class DeleteMultiLevelOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
|
||||
private void createData() {
|
||||
Preisregelung preisregelung = new Preisregelung();
|
||||
preisregelung.setId( 17960L );
|
||||
|
||||
Tranchenmodell tranchenmodell = new Tranchenmodell();
|
||||
tranchenmodell.setId( 1951L );
|
||||
|
||||
Tranche tranche1 = new Tranche();
|
||||
tranche1.setId( 1951L);
|
||||
|
||||
Tranche tranche2 = new Tranche();
|
||||
tranche2.setId( 1952L);
|
||||
|
||||
preisregelung.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.setPreisregelung( preisregelung );
|
||||
|
||||
tranchenmodell.getTranchen().add( tranche1 );
|
||||
tranche1.setTranchenmodell( tranchenmodell );
|
||||
tranchenmodell.getTranchen().add( tranche2 );
|
||||
tranche2.setTranchenmodell( tranchenmodell );
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.save( preisregelung );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete Tranche" ).executeUpdate();
|
||||
session.createQuery( "delete Preisregelung" ).executeUpdate();
|
||||
session.createQuery( "delete Tranchenmodell" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9091")
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
assertNotNull( preisregelung.getTranchenmodell() );
|
||||
preisregelung.setTranchenmodell( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
|
||||
preisregelung = (Preisregelung) session.get( Preisregelung.class, preisregelung.getId() );
|
||||
assertNull( preisregelung.getTranchenmodell() );
|
||||
results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9091")
|
||||
public void testReplacedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung = (Preisregelung) results.get( 0 );
|
||||
assertNotNull( preisregelung.getTranchenmodell() );
|
||||
|
||||
// Replace with a new Tranchenmodell instance
|
||||
Tranchenmodell tranchenmodellNew = new Tranchenmodell();
|
||||
tranchenmodellNew.setId( 1952L );
|
||||
preisregelung.setTranchenmodell( tranchenmodellNew );
|
||||
tranchenmodellNew.setPreisregelung( preisregelung );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
results = session.createQuery( "from Tranchenmodell" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Tranchenmodell tranchenmodellQueried = (Tranchenmodell) results.get( 0 );
|
||||
assertEquals( tranchenmodellNew.getId(), tranchenmodellQueried.getId() );
|
||||
results = session.createQuery( "from Preisregelung" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Preisregelung preisregelung1Queried = (Preisregelung) results.get( 0 );
|
||||
assertEquals( preisregelung1Queried.getTranchenmodell(), tranchenmodellQueried );
|
||||
results = session.createQuery( "from Tranche" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class[]{
|
||||
Preisregelung.class,
|
||||
Tranche.class,
|
||||
Tranchenmodell.class
|
||||
};
|
||||
}
|
||||
|
||||
}
|
|
@ -1,155 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.fk.reversed.unidirectional;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DeleteOneToOneOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/one2one/fk/reversed/unidirectional/Mapping.hbm.xml" };
|
||||
}
|
||||
|
||||
private void createData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo() );
|
||||
session.save( emp );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = ( Employee ) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = ( Employee ) session.get( Employee.class, emp.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-5267" )
|
||||
public void testOrphanedWhileDetached() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = ( Employee ) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
//only fails if the object is detached
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
|
||||
emp.setInfo( null );
|
||||
|
||||
//save using the new session (this used to work prior to 3.5.x)
|
||||
session.saveOrUpdate(emp);
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = ( Employee ) session.get( Employee.class, emp.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
// TODO: If merge was used instead of saveOrUpdate, this would work.
|
||||
// However, re-attachment does not currently support handling orphans.
|
||||
// See HHH-3795
|
||||
// results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
// assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-6484")
|
||||
public void testReplacedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = (Employee) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
|
||||
// Replace with a new EmployeeInfo instance
|
||||
emp.setInfo( new EmployeeInfo() );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = (Employee) session.get( Employee.class, emp.getId() );
|
||||
assertNotNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.pk.bidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DeleteOneToOneOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/one2one/pk/bidirectional/Mapping.hbm.xml" };
|
||||
}
|
||||
|
||||
private void createData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
Employee emp = new Employee();
|
||||
emp.setInfo( new EmployeeInfo( emp ) );
|
||||
session.save( emp );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = ( Employee ) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
emp.setInfo( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = ( Employee ) session.get( Employee.class, emp.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.one2one.pk.unidirectional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DeleteOneToOneOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
@Override
|
||||
public String[] getMappings() {
|
||||
return new String[] { "orphan/one2one/pk/unidirectional/Mapping.hbm.xml" };
|
||||
}
|
||||
|
||||
private void createData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
Employee emp = new Employee();
|
||||
session.save( emp );
|
||||
emp.setInfo( new EmployeeInfo( emp.getId() ) );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete EmployeeInfo" ).executeUpdate();
|
||||
session.createQuery( "delete Employee" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Employee emp = ( Employee ) results.get( 0 );
|
||||
assertNotNull( emp.getInfo() );
|
||||
results = session.createQuery( "from Employee e, EmployeeInfo i where e.info = i" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Object [] result = ( Object [] ) results.get( 0 );
|
||||
emp = ( Employee ) result[ 0 ];
|
||||
assertNotNull( result[ 1 ] );
|
||||
assertSame( emp.getInfo(), result[ 1 ] );
|
||||
emp.setInfo( null );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
emp = ( Employee ) session.get( Employee.class, emp.getId() );
|
||||
assertNull( emp.getInfo() );
|
||||
results = session.createQuery( "from EmployeeInfo" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Employee" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
}
|
|
@ -1,167 +0,0 @@
|
|||
/*
|
||||
* 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.test.orphan.onetomany;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Gail Badnmer
|
||||
*/
|
||||
public class DeleteOneToManyOrphansTest extends BaseCoreFunctionalTestCase {
|
||||
|
||||
private void createData() {
|
||||
Session s = openSession();
|
||||
s.getTransaction().begin();
|
||||
|
||||
Feature newFeature = new Feature();
|
||||
newFeature.setName("Feature 1");
|
||||
s.persist( newFeature );
|
||||
|
||||
Product product = new Product();
|
||||
newFeature.setProduct( product );
|
||||
product.getFeatures().add( newFeature );
|
||||
s.persist( product );
|
||||
|
||||
s.getTransaction().commit();
|
||||
s.clear();
|
||||
|
||||
}
|
||||
|
||||
private void cleanupData() {
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
session.createQuery( "delete Feature" ).executeUpdate();
|
||||
session.createQuery( "delete Product" ).executeUpdate();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9330")
|
||||
public void testOrphanedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product product = ( Product ) results.get( 0 );
|
||||
assertEquals( 1, product.getFeatures().size() );
|
||||
product.getFeatures().clear();
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
|
||||
product = ( Product ) session.get( Product.class, product.getId() );
|
||||
assertEquals( 0, product.getFeatures().size() );
|
||||
results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9330")
|
||||
public void testOrphanedWhileManagedMergeOwner() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product product = ( Product ) results.get( 0 );
|
||||
assertEquals( 1, product.getFeatures().size() );
|
||||
product.getFeatures().clear();
|
||||
session.merge( product );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
|
||||
product = ( Product ) session.get( Product.class, product.getId() );
|
||||
assertEquals( 0, product.getFeatures().size() );
|
||||
results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 0, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue( jiraKey = "HHH-9330")
|
||||
public void testReplacedWhileManaged() {
|
||||
createData();
|
||||
|
||||
Session session = openSession();
|
||||
session.beginTransaction();
|
||||
List results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product product = ( Product ) results.get( 0 );
|
||||
assertEquals( 1, product.getFeatures().size() );
|
||||
|
||||
// Replace with a new Feature instance
|
||||
product.getFeatures().remove( 0 );
|
||||
Feature featureNew = new Feature();
|
||||
featureNew.setName( "Feature 2" );
|
||||
featureNew.setProduct( product );
|
||||
product.getFeatures().add( featureNew );
|
||||
session.persist( featureNew );
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
session = openSession();
|
||||
session.beginTransaction();
|
||||
results = session.createQuery( "from Feature" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Feature featureQueried = (Feature) results.get( 0 );
|
||||
assertEquals( featureNew.getId(), featureQueried.getId() );
|
||||
results = session.createQuery( "from Product" ).list();
|
||||
assertEquals( 1, results.size() );
|
||||
Product productQueried = (Product) results.get( 0 );
|
||||
assertEquals( 1, productQueried.getFeatures().size() );
|
||||
assertEquals( featureQueried, productQueried.getFeatures().get( 0 ) );
|
||||
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
cleanupData();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class[]{
|
||||
Product.class,
|
||||
Feature.class
|
||||
};
|
||||
}
|
||||
}
|
|
@ -6,6 +6,8 @@
|
|||
*/
|
||||
package org.hibernate.testing.orm.junit;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
import org.junit.jupiter.api.extension.ParameterContext;
|
||||
import org.junit.jupiter.api.extension.ParameterResolutionException;
|
||||
|
|
Loading…
Reference in New Issue