Author: steve.ebersole(a)jboss.com
Date: 2010-05-26 17:31:54 -0400 (Wed, 26 May 2010)
New Revision: 19623
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Card.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/CardField.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/EagerKeyManyToOneTest.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Key.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/PrimaryKey.java
Log:
HHH-4147 - Eager Bidirectional association with @ManyToOne in PK lead to infinite loop
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Card.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Card.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Card.java 2010-05-26
21:31:54 UTC (rev 19623)
@@ -0,0 +1,77 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.cid.keymanytoone;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+@Entity
+public class Card implements Serializable {
+ @Id
+ private String id;
+
+ @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy =
"primaryKey.card")
+ private Set<CardField> fields;
+
+ public Card(String id) {
+ this();
+ this.id = id;
+
+ }
+
+ Card() {
+ fields = new HashSet<CardField>();
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void addField(Card card, Key key) {
+ fields.add(new CardField(card, key));
+ }
+
+ public Set<CardField> getFields() {
+ return fields;
+ }
+
+ public void setFields(Set<CardField> fields) {
+ this.fields = fields;
+ }
+}
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/CardField.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/CardField.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/CardField.java 2010-05-26
21:31:54 UTC (rev 19623)
@@ -0,0 +1,56 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.cid.keymanytoone;
+
+import java.io.Serializable;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+@Entity
+public class CardField implements Serializable {
+
+ @EmbeddedId
+ private PrimaryKey primaryKey;
+
+ CardField(Card card, Key key) {
+ this.primaryKey = new PrimaryKey(card, key);
+ }
+
+ CardField() {
+ }
+
+ public PrimaryKey getPrimaryKey() {
+ return primaryKey;
+ }
+
+ public void setPrimaryKey(PrimaryKey primaryKey) {
+ this.primaryKey = primaryKey;
+ }
+}
+
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/EagerKeyManyToOneTest.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/EagerKeyManyToOneTest.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/EagerKeyManyToOneTest.java 2010-05-26
21:31:54 UTC (rev 19623)
@@ -0,0 +1,89 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.cid.keymanytoone;
+
+import org.hibernate.Session;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class EagerKeyManyToOneTest extends TestCase {
+ public static final String CARD_ID = "cardId";
+ public static final String KEY_ID = "keyId";
+
+ @Override
+ protected Class<?>[] getAnnotatedClasses() {
+ return new Class[] { Card.class, CardField.class, Key.class, PrimaryKey.class };
+ }
+
+ public void testLoadEntityWithEagerFetchingToKeyManyToOneReferenceBackToSelf() {
+ // based on the core testsuite test of same name in
org.hibernate.test.keymanytoone.bidir.component.EagerKeyManyToOneTest
+ // meant to test against regression relating to
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2277
+ // and
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4147
+
+ {
+ Session s = openSession();
+ s.beginTransaction();
+ Card card = new Card( CARD_ID );
+ Key key = new Key( KEY_ID );
+ card.addField( card, key );
+ s.persist( key );
+ s.persist( card );
+ s.getTransaction().commit();
+ s.close();
+ }
+
+ {
+ Session s = openSession();
+ s.beginTransaction();
+ try {
+ Card card = (Card) s.get( Card.class, CARD_ID );
+ assertEquals( 1, card.getFields().size() );
+ CardField cf = card.getFields().iterator().next();
+ assertSame( card, cf.getPrimaryKey().getCard() );
+ }
+ catch ( StackOverflowError soe ) {
+ fail( "eager + key-many-to-one caused stack-overflow in annotations" );
+ }
+ finally {
+ s.getTransaction().commit();
+ s.close();
+ }
+ }
+
+ {
+ Session s = openSession();
+ s.beginTransaction();
+ Card card = (Card) s.get( Card.class, CARD_ID );
+ Key key = (Key) s.get( Key.class, KEY_ID );
+ s.delete( card );
+ s.delete( key );
+ s.getTransaction().commit();
+ s.close();
+ }
+ }
+}
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Key.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Key.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/Key.java 2010-05-26
21:31:54 UTC (rev 19623)
@@ -0,0 +1,54 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.cid.keymanytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+@Entity
+public class Key implements Serializable {
+ @Id
+ private String id;
+
+ public Key(String id) {
+ this.id = id;
+ }
+
+ Key() {
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+}
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/PrimaryKey.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/PrimaryKey.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid/keymanytoone/PrimaryKey.java 2010-05-26
21:31:54 UTC (rev 19623)
@@ -0,0 +1,66 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, 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.cid.keymanytoone;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+@Embeddable
+public class PrimaryKey implements Serializable {
+ @ManyToOne(optional = false)
+ private Card card;
+
+ @ManyToOne(optional = false)
+ private Key key;
+
+ public PrimaryKey(Card card, Key key) {
+ this.card = card;
+ this.key = key;
+ }
+
+ PrimaryKey() {
+ }
+
+ public Card getCard() {
+ return card;
+ }
+
+ public void setCard(Card card) {
+ this.card = card;
+ }
+
+ public Key getKey() {
+ return key;
+ }
+
+ public void setKey(Key key) {
+ this.key = key;
+ }
+}