[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