[hibernate-commits] Hibernate SVN: r19881 - in core/branches/Branch_3_5/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
Thu Jul 1 07:09:46 EDT 2010


Author: sharathjreddy
Date: 2010-07-01 07:09:45 -0400 (Thu, 01 Jul 2010)
New Revision: 19881

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

Modified: core/branches/Branch_3_5/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- core/branches/Branch_3_5/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2010-06-30 18:30:58 UTC (rev 19880)
+++ core/branches/Branch_3_5/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java	2010-07-01 11:09:45 UTC (rev 19881)
@@ -1563,7 +1563,9 @@
 					}
 				}
 				//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/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java
===================================================================
--- core/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java	2010-06-30 18:30:58 UTC (rev 19880)
+++ core/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OneToOneTest.java	2010-07-01 11:09:45 UTC (rev 19881)
@@ -3,6 +3,7 @@
 
 import java.util.Iterator;
 
+import org.hibernate.EmptyInterceptor;
 import org.hibernate.Query;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
@@ -175,7 +176,6 @@
 		party.partyAffiliate = affiliate;
 		affiliate.party = party;
 		s.persist( party );
-		s.persist( affiliate );
 		s.getTransaction().commit();
 
 		s.clear();
@@ -270,6 +270,40 @@
 				"The mapping defines join columns which could not be found in the metadata.", fooFound && barFound
 		);
 	}
+	
+	/**
+	 * 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()
@@ -299,3 +333,55 @@
 		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/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java
===================================================================
--- core/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java	2010-06-30 18:30:58 UTC (rev 19880)
+++ core/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/OwnerAddress.java	2010-07-01 11:09:45 UTC (rev 19881)
@@ -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/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/Party.java
===================================================================
--- core/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/Party.java	2010-06-30 18:30:58 UTC (rev 19880)
+++ core/branches/Branch_3_5/annotations/src/test/java/org/hibernate/test/annotations/onetoone/Party.java	2010-07-01 11:09:45 UTC (rev 19881)
@@ -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