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

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Apr 27 04:38:28 EDT 2010


Author: sharathjreddy
Date: 2010-04-27 04:38:27 -0400 (Tue, 27 Apr 2010)
New Revision: 19308

Modified:
   core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
   core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java
   core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java
   core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/Party.java
Log:
HHH-5109 @OneToOne - too many joins

Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2010-04-27 08:33:14 UTC (rev 19307)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2010-04-27 08:38:27 UTC (rev 19308)
@@ -1563,7 +1563,8 @@
 					}
 				}
 				//MapsId means the columns belong to the pk => not null
-				final boolean mandatory = !ann.optional() || forcePersist;
+				//@PKJC must be constrained
+				final boolean mandatory = !ann.optional() || forcePersist || trueOneToOne;
 				bindOneToOne(
 						getCascadeStrategy( ann.cascade(), hibernateCascade, ann.orphanRemoval(), forcePersist ),
 						joinColumns,

Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java	2010-04-27 08:33:14 UTC (rev 19307)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java	2010-04-27 08:38:27 UTC (rev 19308)
@@ -3,6 +3,7 @@
 
 import java.util.Iterator;
 
+import org.hibernate.EmptyInterceptor;
 import org.hibernate.Query;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
@@ -174,8 +175,8 @@
 		party.partyId = "id";
 		party.partyAffiliate = affiliate;
 		affiliate.party = party;
+		
 		s.persist( party );
-		s.persist( affiliate );
 		s.getTransaction().commit();
 
 		s.clear();
@@ -272,6 +273,41 @@
 	}
 
 	/**
+	 * HHH-5109 @OneToOne - too many joins
+	 * This test uses an interceptor to verify that correct number of joins
+	 * are generated. 
+	 */
+	public void testPkOneToOneSelectStatementDoesNotGenerateExtraJoin() {
+		
+		Session s = openSession(new JoinCounter(1));
+		Transaction tx = s.beginTransaction();
+		Owner owner = new Owner();
+		OwnerAddress address = new OwnerAddress();
+		owner.setAddress( address );
+		address.setOwner( owner );
+		s.persist( owner );
+		s.flush();
+		s.clear();
+		
+		owner = ( Owner ) s.get( Owner.class, owner.getId() );
+		assertNotNull( owner );
+		assertNotNull( owner.getAddress() );
+		assertEquals( owner.getId(), owner.getAddress().getId() );
+		s.flush();
+		s.clear();
+		
+		address = ( OwnerAddress ) s.get( OwnerAddress.class, address.getId() );
+		assertNotNull( address );
+		assertNotNull( address.getOwner() );
+		assertEquals( address.getId(), address.getOwner().getId() );
+		
+		tx.rollback();
+		s.close();
+	}
+	
+	
+	
+	/**
 	 * @see org.hibernate.test.annotations.TestCase#getAnnotatedClasses()
 	 */
 	protected Class[] getAnnotatedClasses() {
@@ -299,3 +335,54 @@
 		return new String[] { "org/hibernate/test/annotations/onetoone/orm.xml" };
 	}
 }
+
+
+/**
+ * Verifies that generated 'select' statement has desired number of joins 
+ * @author Sharath Reddy
+ *
+ */
+class JoinCounter extends EmptyInterceptor {
+	 
+	private static final long serialVersionUID = -3689681272273261051L;
+	
+	private int expectedNumberOfJoins = 0;
+			
+	public JoinCounter(int val) {
+		super();
+		this.expectedNumberOfJoins = val;
+	}
+
+	public String onPrepareStatement(String sql) {
+				
+		int numberOfJoins = 0;
+		if (sql.startsWith("select")) {
+			 numberOfJoins = count(sql, "join");
+			 TestCase.assertEquals(expectedNumberOfJoins, numberOfJoins);
+		}
+						
+		return sql;
+	 }
+	
+	 /**
+	   * Count the number of instances of substring within a string.
+	   *
+	   * @param string     String to look for substring in.
+	   * @param substring  Sub-string to look for.
+	   * @return           Count of substrings in string.
+	   */
+	  private int count(final String string, final String substring)
+	  {
+	     int count = 0;
+	     int idx = 0;
+
+	     while ((idx = string.indexOf(substring, idx)) != -1)
+	     {
+	        idx++;
+	        count++;
+	     }
+
+	     return count;
+	  }
+	
+}

Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java	2010-04-27 08:33:14 UTC (rev 19307)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java	2010-04-27 08:38:27 UTC (rev 19308)
@@ -18,7 +18,7 @@
 	@GenericGenerator(strategy = "foreign", name = "fk", parameters = @Parameter(name="property", value="owner"))
 	private Integer id;
 
-	@OneToOne(mappedBy="address", optional = false)
+	@OneToOne(mappedBy="address")
 	private Owner owner;
 
 	public Integer getId() {

Modified: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/Party.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/Party.java	2010-04-27 08:33:14 UTC (rev 19307)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/onetoone/Party.java	2010-04-27 08:38:27 UTC (rev 19308)
@@ -1,6 +1,7 @@
 //$Id$
 package org.hibernate.test.annotations.onetoone;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.OneToOne;
@@ -14,7 +15,7 @@
 	@Id
 	String partyId;
 
-	@OneToOne
+	@OneToOne(cascade=CascadeType.ALL)
 	@PrimaryKeyJoinColumn
 	PartyAffiliate partyAffiliate;
 }



More information about the hibernate-commits mailing list