Hello,
    First of all I'm sending this patch that resolves the problem of the
missing primary key on associations tables for many to many relations (I
set the pk to the concatenations of joinColumns+inverseJoinColumns).

    Second I have a doubt with the changes in the events classes.  I'm
using the Pre(Inset|Update|Delete)Event events to make an audit log
framework but in the HEAD branch this classes don't have the
getSession() method anymore. My question is how I obtain the jdbc
connection of the current session?

here is a example:

public class PreInsertAuditor extends DefaultPreInsertEventListener {
   
    private AuditLog auditLog;
   
    @Override
    public boolean onPreInsert(PreInsertEvent event) {
        if (!(event.getEntity() instanceof AuditLogRecord)) {
            auditLog.logEvent("create", event.getEntity(),
                event.getSession().connection());//this line does not
compile :(
        }
        return super.onPreInsert(event);
    }

    public void setAuditLog(AuditLog auditLog) {
        this.auditLog = auditLog;
    }
}


    Thanks!

-- 
Pablo Nussembaum
Refert
Index: org/hibernate/cfg/AnnotationBinder.java
===================================================================
RCS file: 
/cvsroot/hibernate/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java,v
retrieving revision 1.90
diff -u -r1.90 AnnotationBinder.java
--- org/hibernate/cfg/AnnotationBinder.java     9 Jun 2005 18:34:52 -0000       
1.90
+++ org/hibernate/cfg/AnnotationBinder.java     9 Jun 2005 22:38:57 -0000
@@ -8,6 +8,7 @@
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -90,6 +91,7 @@
 import org.hibernate.mapping.Join;
 import org.hibernate.mapping.JoinedSubclass;
 import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.PrimaryKey;
 import org.hibernate.mapping.Property;
 import org.hibernate.mapping.RootClass;
 import org.hibernate.mapping.SimpleValue;
@@ -99,6 +101,7 @@
 import org.hibernate.persister.entity.JoinedSubclassEntityPersister;
 import org.hibernate.persister.entity.SingleTableEntityPersister;
 import org.hibernate.persister.entity.UnionSubclassEntityPersister;
+import org.hibernate.sql.Alias;
 import org.hibernate.type.ByteArrayBlobType;
 import org.hibernate.type.CharacterArrayClobType;
 import org.hibernate.type.ForeignKeyDirection;
@@ -891,7 +894,7 @@
                                collectionBinder.setUnique(false);
                                collectionBinder.setTargetEntity( 
manyToManyAnn.targetEntity() );
                                collectionBinder.setFetchType( 
manyToManyAnn.fetch() );
-                               collectionBinder.setCascadeStrategy( 
getCascadeStrategy( manyToManyAnn.cascade(), hibernateCascade ) );
+                               collectionBinder.setCascadeStrategy( 
getCascadeStrategy( manyToManyAnn.cascade(), hibernateCascade ) ); 
                        }
                        collectionBinder.setMappedBy( mappedBy );
                        if (isForeignKey) {
@@ -1036,11 +1039,33 @@
                }
                Ejb3JoinColumn[] joinColumns = buildArrayOfEjb3JoinColumn( 
annJoins, entityBinder.getSecondaryTables(), propertyHolder, 
inferredData.getPropertyName(), mappedBy, mappings);
                Ejb3JoinColumn[] inverseJoinColumns = 
buildArrayOfEjb3JoinColumn( annInverseJoins, entityBinder.getSecondaryTables(), 
propertyHolder, inferredData.getPropertyName(), mappedBy, mappings);
+               buildPKForAssocTable(assocTable, joinColumns, 
inverseJoinColumns);
                collectionBinder.setTable(assocTable);
                collectionBinder.setJoinColumns(joinColumns);
                collectionBinder.setInverseJoinColumns(inverseJoinColumns);
        }
 
+       /**
+        * @param assocTable
+        * @param joinColumns
+        * @param inverseJoinColumns
+        */
+       private static void buildPKForAssocTable(Table assocTable, 
Ejb3JoinColumn[] joinColumns, Ejb3JoinColumn[] inverseJoinColumns) {
+               List<org.hibernate.mapping.Column> pkColumns = new 
LinkedList<org.hibernate.mapping.Column>();
+               for (Ejb3JoinColumn ejb3JoinColumn : joinColumns) {
+                       pkColumns.add(ejb3JoinColumn.getMappingColumn());
+               }
+               for (Ejb3JoinColumn ejb3JoinColumn : inverseJoinColumns) {
+                       pkColumns.add(ejb3JoinColumn.getMappingColumn());
+               }
+               PrimaryKey pk = new PrimaryKey();               
+               pk.setTable(assocTable);
+               pk.setName( new Alias(15, "PK").toAliasString( 
assocTable.getName() ) );
+               assocTable.setPrimaryKey(pk);
+
+               pk.addColumns( pkColumns.iterator() );
+       }
+
        private static Ejb3JoinColumn[] buildArrayOfEjb3JoinColumn(JoinColumn[] 
annJoins, Map<String, Join> secondaryTables,
                                                                                
                                           PropertyHolder propertyHolder, 
String propertyName, String mappedBy, ExtendedMappings mappings) {
                Ejb3JoinColumn[] joinColumns;

Reply via email to