[hibernate-commits] Hibernate SVN: r12754 - in trunk/HibernateExt/annotations/src: test/org/hibernate/test/annotations/cid and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jul 11 18:20:24 EDT 2007


Author: epbernard
Date: 2007-07-11 18:20:24 -0400 (Wed, 11 Jul 2007)
New Revision: 12754

Added:
   trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/SecondaryTableSecondPass.java
   trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgram.java
   trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgramIdClass.java
Modified:
   trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java
   trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java
   trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java
Log:
ANN-602 process SecondaryTable PK binding in a second pass to handle @ManyToOne PKs

Modified: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java	2007-07-11 18:21:44 UTC (rev 12753)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java	2007-07-11 22:20:24 UTC (rev 12754)
@@ -761,7 +761,6 @@
 
 		if ( !inheritanceState.hasParents ) {
 			final RootClass rootClass = (RootClass) persistentClass;
-			//no need to handle inSecondPass this is an Entity related work
 			mappings.addSecondPass( new CreateKeySecondPass( rootClass ) );
 		}
 		else {
@@ -769,8 +768,10 @@
 		}
 
 		mappings.addClass( persistentClass );
-		entityBinder.finalSecondaryTableBinding( propertyHolder );
 
+		mappings.addSecondPass( new SecondaryTableSecondPass(entityBinder, propertyHolder) );
+		//entityBinder.finalSecondaryTableBinding( propertyHolder );
+
 		//add process complementary Table definition (index & all)
 		entityBinder.processComplementaryTableDefinitions( annotatedClass.getAnnotation( org.hibernate.annotations.Table.class ) );
 		entityBinder.processComplementaryTableDefinitions( annotatedClass.getAnnotation( org.hibernate.annotations.Tables.class ) );

Modified: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java	2007-07-11 18:21:44 UTC (rev 12753)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java	2007-07-11 22:20:24 UTC (rev 12754)
@@ -302,6 +302,16 @@
 				iter.remove();
 			}
 		}
+
+		iter = secondPasses.iterator();
+		while ( iter.hasNext() ) {
+			SecondPass sp = (SecondPass) iter.next();
+			//do the SecondaryTable second pass before any association becasue associations can be built on joins 
+			if ( sp instanceof SecondaryTableSecondPass ) {
+				sp.doSecondPass( classes );
+				iter.remove();
+			}
+		}
 		super.secondPassCompile();
 		inSecondPass = false;
 		Iterator tables = (Iterator<Map.Entry<Table, List<String[]>>>) tableUniqueConstraints.entrySet().iterator();

Added: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/SecondaryTableSecondPass.java
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/SecondaryTableSecondPass.java	                        (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/SecondaryTableSecondPass.java	2007-07-11 22:20:24 UTC (rev 12754)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.hibernate.MappingException;
+import org.hibernate.cfg.annotations.EntityBinder;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SecondaryTableSecondPass implements SecondPass {
+	private EntityBinder entityBinder;
+	private PropertyHolder propertyHolder;
+
+	public SecondaryTableSecondPass(EntityBinder entityBinder, PropertyHolder propertyHolder) {
+		this.entityBinder = entityBinder;
+		this.propertyHolder = propertyHolder;
+	}
+
+	public void doSecondPass(Map persistentClasses) throws MappingException {
+		entityBinder.finalSecondaryTableBinding( propertyHolder );
+	}
+}

Modified: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java	2007-07-11 18:21:44 UTC (rev 12753)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java	2007-07-11 22:20:24 UTC (rev 12754)
@@ -164,12 +164,83 @@
 		s.close();
 	}
 
+	public void testSecondaryTableWithCompositeId() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Channel channel = new Channel();
+		s.persist( channel );
+		Presenter pres = new Presenter();
+		pres.name = "Tim Russet";
+		s.persist( pres );
+		TvMagazinPk pk = new TvMagazinPk();
+		TvProgram program = new TvProgram();
+		program.time = new Date();
+		program.id = pk;
+		program.text = "Award Winning Programming";
+		//pk.name = "Trax";
+		pk.channel = channel;
+		pk.presenter = pres;
+		s.persist( program );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		program = (TvProgram) s.createQuery( "from TvProgram pr" ) // where mag.id.name = :name")
+				//.setParameter( "name", "Trax" )
+				.uniqueResult();
+		assertNotNull( program.id );
+		assertNotNull( program.id.channel );
+		assertEquals( channel.id, program.id.channel.id );
+		assertNotNull( program.id.presenter );
+		assertNotNull( program.text );
+		assertEquals( pres.name, program.id.presenter.name );
+		s.delete( program );
+		s.delete( program.id.channel );
+		s.delete( program.id.presenter );
+		tx.commit();
+		s.close();
+	}
+
+	public void testSecondaryTableWithIdClass() throws Exception {
+		Session s = openSession();
+		Transaction tx = s.beginTransaction();
+		Channel channel = new Channel();
+		s.persist( channel );
+		Presenter pres = new Presenter();
+		pres.name = "Bob";
+		s.persist( pres );
+		TvProgramIdClass program = new TvProgramIdClass();
+		program.time = new Date();
+		program.channel = channel;
+		program.presenter = pres;
+		program.text = "Jump the shark programming";
+		//pk.name = "Trax";
+		s.persist( program );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		program = (TvProgramIdClass) s.createQuery( "from TvProgramIdClass pr" ) // where mag.id.name = :name")
+				//.setParameter( "name", "Trax" )
+				.uniqueResult();
+		assertNotNull( program.channel );
+		assertEquals( channel.id, program.channel.id );
+		assertNotNull( program.presenter );
+		assertNotNull( program.text );
+		assertEquals( pres.name, program.presenter.name );
+		s.delete( program );
+		s.delete( program.channel );
+		s.delete( program.presenter );
+		tx.commit();
+		s.close();
+	}
+
 	protected Class[] getMappings() {
 		return new Class[] {
 				Parent.class,
 				Child.class,
 				Channel.class,
 				TvMagazin.class,
+				TvProgramIdClass.class,
+				TvProgram.class,
 				Presenter.class,
 				Order.class,
 				Product.class,

Added: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgram.java
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgram.java	                        (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgram.java	2007-07-11 22:20:24 UTC (rev 12754)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+/**
+ * @author Chandra Patni
+ */
+ at Entity
+ at SecondaryTable( name = "TV_PROGRAM_EXT", pkJoinColumns = {
+ at PrimaryKeyJoinColumn( name = "CHANNEL_ID" ),
+ at PrimaryKeyJoinColumn( name = "PRESENTER_NAME" )
+		} )
+public class TvProgram {
+	@EmbeddedId
+	public TvMagazinPk id;
+
+	@Temporal( TemporalType.TIME )
+	Date time;
+
+	@Column( name = "TXT", table = "TV_PROGRAM_EXT" )
+	public String text;
+
+}
\ No newline at end of file

Added: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgramIdClass.java
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgramIdClass.java	                        (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvProgramIdClass.java	2007-07-11 22:20:24 UTC (rev 12754)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+ at Entity
+ at SecondaryTable( name = "TV_PROGRAM_IDCLASS", pkJoinColumns =
+		{
+		@PrimaryKeyJoinColumn( name = "CHANNEL_ID" ),
+		@PrimaryKeyJoinColumn( name = "PRESENTER_NAME" )
+				} )
+ at IdClass( TvMagazinPk.class )
+public class TvProgramIdClass {
+	@Id
+	public Channel channel;
+	@Id
+	public Presenter presenter;
+
+	@Temporal( TemporalType.TIME )
+	Date time;
+
+	@Column( name = "TXT", table = "TV_PROGRAM_IDCLASS" )
+	public String text;
+}
+
+




More information about the hibernate-commits mailing list