[hibernate-commits] Hibernate SVN: r19623 - in core/trunk/annotations/src/test/java/org/hibernate/test/annotations/cid: keymanytoone and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed May 26 17:31:54 EDT 2010


Author: steve.ebersole at 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
+ */
+ at 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
+ */
+ at 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
+ */
+ at 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
+ */
+ at 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;
+	}
+}



More information about the hibernate-commits mailing list