From 0fc95e54b3e6d5a0705ec0fb66e37df032cd981c Mon Sep 17 00:00:00 2001 From: Gail Badner Date: Wed, 23 Nov 2011 02:48:02 -0800 Subject: [PATCH] HHH-5472 : Add test case with circular non-nullable associations --- .../test/annotations/cascade/Child.java | 61 ++++++++++++++++ ...NullableCircularDependencyCascadeTest.java | 73 +++++++++++++++++++ .../test/annotations/cascade/Parent.java | 69 ++++++++++++++++++ 3 files changed, 203 insertions(+) create mode 100644 hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Child.java create mode 100644 hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/NonNullableCircularDependencyCascadeTest.java create mode 100644 hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Parent.java diff --git a/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Child.java b/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Child.java new file mode 100644 index 0000000000..e850de8777 --- /dev/null +++ b/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Child.java @@ -0,0 +1,61 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2011, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.test.annotations.cascade; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; + +/** + * @author Jeff Schnitzer + */ +@Entity +public class Child +{ + /** */ + @Id + @GeneratedValue + public Long id; + + /** */ + @ManyToOne(cascade=CascadeType.PERSIST) + @JoinColumn(name="parentId", nullable=false) + Parent parent; + + /** */ + public Child() {} + + /** */ + public Child(Parent p) + { + this.parent = p; + } + + /** */ + public Parent getParent() { return this.parent; } + public void setParent(Parent value) { this.parent = value; } +} diff --git a/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/NonNullableCircularDependencyCascadeTest.java b/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/NonNullableCircularDependencyCascadeTest.java new file mode 100644 index 0000000000..8ade3cd2de --- /dev/null +++ b/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/NonNullableCircularDependencyCascadeTest.java @@ -0,0 +1,73 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2011, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.test.annotations.cascade; + +import java.util.HashSet; + +import org.junit.Test; + +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; + +import static org.junit.Assert.fail; + +/** + * @author Jeff Schnitzer + * @author Gail Badner + */ +@SuppressWarnings("unchecked") +public class NonNullableCircularDependencyCascadeTest extends BaseCoreFunctionalTestCase { + @Test + public void testIdClassInSuperclass() throws Exception { + Session s = openSession(); + Transaction tx = s.beginTransaction(); + Parent p = new Parent(); + p.setChildren( new HashSet() ); + + Child ch = new Child(p); + p.getChildren().add(ch); + p.setDefaultChild(ch); + + try { + s.persist(p); + s.flush(); + fail( "should have failed because of transient entities have non-nullable, circular dependency." ); + } + catch ( HibernateException ex) { + // expected + } + tx.rollback(); + s.close(); + } + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[]{ + Child.class, + Parent.class + }; + } +} diff --git a/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Parent.java b/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Parent.java new file mode 100644 index 0000000000..0633daca9b --- /dev/null +++ b/hibernate-core/src/matrix/java/org/hibernate/test/annotations/cascade/Parent.java @@ -0,0 +1,69 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2011, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.test.annotations.cascade; + +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * @author Jeff Schnitzer + */ +@Entity +public class Parent +{ + /** */ + @Id + @GeneratedValue + public Long id; + + /** */ + @OneToMany(cascade=CascadeType.ALL, mappedBy="parent") + public Set children; + + /** */ + @OneToOne(cascade=CascadeType.ALL) + @JoinColumn(name="defaultChildId", nullable=false) + Child defaultChild; + + /** */ + public Parent() {} + + /** */ + public Child getDefaultChild() { return this.defaultChild; } + public void setDefaultChild(Child value) { this.defaultChild = value; } + + /** */ + public Set getChildren() { return this.children; } + public void setChildren(Set value) { this.children = value; } +}