User: dsundstrom
  Date: 01/12/01 13:55:05

  Modified:    src/main/org/jboss/ejb/plugins/cmp/jdbc
                        JDBCAbstractQueryCommand.java
                        JDBCCreateEntityCommand.java
                        JDBCDeleteRelationsCommand.java
                        JDBCFindByForeignKeyCommand.java
                        JDBCInsertRelationsCommand.java
                        JDBCLoadEntityCommand.java
                        JDBCLoadFieldCommand.java
                        JDBCLoadRelationCommand.java
                        JDBCReadAheadCommand.java
                        JDBCRelationInterceptor.java
                        JDBCRemoveEntityCommand.java JDBCStartCommand.java
                        JDBCStopCommand.java JDBCStoreEntityCommand.java
                        JDBCStoreManager.java
  Log:
  Added support for autogenerated foriegn key constraints on relationships.
  Just add <fk-constraint>true</fk-constraint> to defaults or relationship
  role.
  
  Changed relation tables to synchronize data after jdbc store executes.
  
  Revision  Changes    Path
  1.2       +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCAbstractQueryCommand.java
  
  Index: JDBCAbstractQueryCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCAbstractQueryCommand.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JDBCAbstractQueryCommand.java     2001/11/28 11:32:54     1.1
  +++ JDBCAbstractQueryCommand.java     2001/12/01 21:55:04     1.2
  @@ -42,7 +42,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.1 $
  + * @version $Revision: 1.2 $
    */
   public abstract class JDBCAbstractQueryCommand implements JDBCQueryCommand {
      private JDBCStoreManager manager;
  @@ -80,9 +80,10 @@
         PreparedStatement ps = null;
         try {
            // get the connection
  -         con = manager.getDataSource().getConnection();
  +         con = manager.getEntityBridge().getDataSource().getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql);
            
            // set the parameters
  
  
  
  1.9       +5 -3      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCCreateEntityCommand.java
  
  Index: JDBCCreateEntityCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCCreateEntityCommand.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- JDBCCreateEntityCommand.java      2001/11/29 20:40:05     1.8
  +++ JDBCCreateEntityCommand.java      2001/12/01 21:55:04     1.9
  @@ -32,7 +32,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.8 $
  + * @version $Revision: 1.9 $
    */
   public class JDBCCreateEntityCommand implements CreateEntityCommand {
      private JDBCStoreManager manager;
  @@ -151,10 +151,11 @@
         PreparedStatement ps = null;
         try {
            // get the connection
  -         DataSource dataSource = manager.getDataSource();
  +         DataSource dataSource = entity.getDataSource();
            con = dataSource.getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + entityExistsSQL);
            ps = con.prepareStatement(entityExistsSQL);
            
            // set the parameters
  @@ -188,10 +189,11 @@
         int rowsAffected  = 0;
         try {
            // get the connection
  -         DataSource dataSource = manager.getDataSource();
  +         DataSource dataSource = entity.getDataSource();
            con = dataSource.getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + insertEntitySQL);
            ps = con.prepareStatement(insertEntitySQL);
            
            // set the parameters
  
  
  
  1.6       +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDeleteRelationsCommand.java
  
  Index: JDBCDeleteRelationsCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDeleteRelationsCommand.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- JDBCDeleteRelationsCommand.java   2001/11/28 11:32:54     1.5
  +++ JDBCDeleteRelationsCommand.java   2001/12/01 21:55:04     1.6
  @@ -21,7 +21,7 @@
    * Deletes relations from a relation table.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.5 $
  + * @version $Revision: 1.6 $
    */
   public class JDBCDeleteRelationsCommand {
      private JDBCStoreManager manager;
  @@ -60,6 +60,7 @@
            con = dataSource.getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql);
            
            // set the parameters
  @@ -69,7 +70,7 @@
            int rowsAffected = ps.executeUpdate();
            log.debug("Create: Rows affected = " + rowsAffected);
         } catch(Exception e) {
  -         throw new EJBException("Could delete relations from " + 
  +         throw new EJBException("Could not delete relations from " + 
                  relationMetaData.getTableName(), e);
         } finally {
            JDBCUtil.safeClose(ps);
  
  
  
  1.9       +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCFindByForeignKeyCommand.java
  
  Index: JDBCFindByForeignKeyCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCFindByForeignKeyCommand.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- JDBCFindByForeignKeyCommand.java  2001/11/29 18:42:23     1.8
  +++ JDBCFindByForeignKeyCommand.java  2001/12/01 21:55:04     1.9
  @@ -23,7 +23,7 @@
    * entity's table.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.8 $
  + * @version $Revision: 1.9 $
    */
   public class JDBCFindByForeignKeyCommand {
      private JDBCStoreManager manager;
  @@ -59,9 +59,10 @@
         PreparedStatement ps = null;
         try {
            // get the connection
  -         con = manager.getDataSource().getConnection();
  +         con = entity.getDataSource().getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql.toString());
            
            // set the parameters
  
  
  
  1.8       +4 -4      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCInsertRelationsCommand.java
  
  Index: JDBCInsertRelationsCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCInsertRelationsCommand.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JDBCInsertRelationsCommand.java   2001/11/28 11:32:54     1.7
  +++ JDBCInsertRelationsCommand.java   2001/12/01 21:55:04     1.8
  @@ -22,7 +22,7 @@
    * Inserts relations into a relation table.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.7 $
  + * @version $Revision: 1.8 $
    */
   public class JDBCInsertRelationsCommand {
      protected JDBCStoreManager manager;
  @@ -56,11 +56,11 @@
            con = dataSource.getConnection();
            
            // get the sql
  -         String theSQL = getSQL(relationData);
  -         log.debug("InsertRelations command executing: " + theSQL);
  +         String sql = getSQL(relationData);
            
            // get a prepared statement
  -         ps = con.prepareStatement(theSQL);
  +         log.debug("Executing SQL: " + sql);
  +         ps = con.prepareStatement(sql);
            
            Iterator pairs = relationData.addedRelations.iterator();
            while(pairs.hasNext()) {
  
  
  
  1.10      +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadEntityCommand.java
  
  Index: JDBCLoadEntityCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadEntityCommand.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JDBCLoadEntityCommand.java        2001/11/29 18:42:23     1.9
  +++ JDBCLoadEntityCommand.java        2001/12/01 21:55:04     1.10
  @@ -33,7 +33,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dirk Zimmermann</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>danch (Dan Christopherson)</a>
  - * @version $Revision: 1.9 $
  + * @version $Revision: 1.10 $
    */
   public class JDBCLoadEntityCommand implements LoadEntityCommand {
      private JDBCStoreManager manager;
  @@ -78,9 +78,10 @@
         PreparedStatement ps = null;
         try {
            // get the connection
  -         con = manager.getDataSource().getConnection();
  +         con = entity.getDataSource().getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql.toString());
            
            // set the parameters
  
  
  
  1.9       +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadFieldCommand.java
  
  Index: JDBCLoadFieldCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadFieldCommand.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- JDBCLoadFieldCommand.java 2001/11/29 18:42:23     1.8
  +++ JDBCLoadFieldCommand.java 2001/12/01 21:55:04     1.9
  @@ -30,7 +30,7 @@
    * fields.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.8 $
  + * @version $Revision: 1.9 $
    */
   public class JDBCLoadFieldCommand {
      private JDBCStoreManager manager;
  @@ -88,9 +88,10 @@
         PreparedStatement ps = null;
         try {
            // get the connection
  -         con = manager.getDataSource().getConnection();
  +         con = entity.getDataSource().getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql.toString());
            
            // set the parameters
  
  
  
  1.8       +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadRelationCommand.java
  
  Index: JDBCLoadRelationCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadRelationCommand.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JDBCLoadRelationCommand.java      2001/11/29 18:42:23     1.7
  +++ JDBCLoadRelationCommand.java      2001/12/01 21:55:05     1.8
  @@ -22,7 +22,7 @@
    * Loads relations for a particular entity from a relation table.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.7 $
  + * @version $Revision: 1.8 $
    */
   public class JDBCLoadRelationCommand {
      private JDBCStoreManager manager;
  @@ -61,9 +61,10 @@
         PreparedStatement ps = null;
         try {
            // get the connection
  -         con = manager.getDataSource().getConnection();
  +         con = cmrField.getRelationMetaData().getDataSource().getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql.toString());
            
            // set the parameters
  
  
  
  1.6       +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCReadAheadCommand.java
  
  Index: JDBCReadAheadCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCReadAheadCommand.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- JDBCReadAheadCommand.java 2001/11/29 18:42:23     1.5
  +++ JDBCReadAheadCommand.java 2001/12/01 21:55:05     1.6
  @@ -24,7 +24,7 @@
    * JDBCReadAheadCommand
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Oleg Nitz</a>
  - * @version $Revision: 1.5 $
  + * @version $Revision: 1.6 $
    */
   public class JDBCReadAheadCommand {
   
  @@ -71,9 +71,10 @@
         PreparedStatement ps = null;
         try {
            // get the connection
  -         con = manager.getDataSource().getConnection();
  +         con = entity.getDataSource().getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql);
            
            // set the parameters
  
  
  
  1.8       +34 -44    
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRelationInterceptor.java
  
  Index: JDBCRelationInterceptor.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRelationInterceptor.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JDBCRelationInterceptor.java      2001/11/26 03:12:26     1.7
  +++ JDBCRelationInterceptor.java      2001/12/01 21:55:05     1.8
  @@ -32,7 +32,7 @@
    * relationship.  This interceptor also manages the relation table data.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.7 $
  + * @version $Revision: 1.8 $
    */
   public class JDBCRelationInterceptor extends AbstractInterceptor
   {
  @@ -100,7 +100,8 @@
      public Object invoke(MethodInvocation mi) throws Exception
      {
         // We are going to work with the context a lot
  -      EntityEnterpriseContext ctx = 
(EntityEnterpriseContext)mi.getEnterpriseContext();
  +      EntityEnterpriseContext ctx =
  +            (EntityEnterpriseContext)mi.getEnterpriseContext();
         
         // The Tx coming as part of the Method Invocation
         Transaction tx = mi.getTransaction();
  @@ -111,33 +112,46 @@
            {
               
               // call getRelateId
  -            JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge)mi.getArguments()[0];
  +            JDBCCMRFieldBridge cmrField =
  +                  (JDBCCMRFieldBridge)mi.getArguments()[0];
               return cmrField.getRelatedId(ctx);
               
            } else if(ADD_RELATION.equals(mi.getMethod()))
            {
               
               // call addRelation
  -            JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge)mi.getArguments()[0];
  +            JDBCCMRFieldBridge cmrField =
  +                  (JDBCCMRFieldBridge)mi.getArguments()[0];
               
               Object relatedId = mi.getArguments()[1];
               cmrField.addRelation(ctx, relatedId);
               
               RelationData relationData = getRelationData(cmrField, tx);
  -            relationData.addRelation(cmrField, ctx.getId(), 
cmrField.getRelatedCMRField(), relatedId);
  +            relationData.addRelation(
  +                  cmrField,
  +                  ctx.getId(),
  +                  cmrField.getRelatedCMRField(),
  +                  relatedId);
  +
               return null;
               
            } else if(REMOVE_RELATION.equals(mi.getMethod()))
            {
               
               // call removeRelation
  -            JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge)mi.getArguments()[0];
  +            JDBCCMRFieldBridge cmrField = 
  +                  (JDBCCMRFieldBridge)mi.getArguments()[0];
               
               Object relatedId = mi.getArguments()[1];
               cmrField.removeRelation(ctx, relatedId);
               
               RelationData relationData = getRelationData(cmrField, tx);
  -            relationData.removeRelation(cmrField, ctx.getId(), 
cmrField.getRelatedCMRField(), relatedId);
  +            relationData.removeRelation(
  +                  cmrField,
  +                  ctx.getId(),
  +                  cmrField.getRelatedCMRField(),
  +                  relatedId);
  +
               return null;
               
            } else
  @@ -152,7 +166,8 @@
         }
      }
      
  -   protected RelationData getRelationData(JDBCCMRFieldBridge cmrField, Transaction 
tx)
  +   protected RelationData getRelationData(
  +         JDBCCMRFieldBridge cmrField, Transaction tx)
      {
         Map txDataMap = cmrField.getJDBCStoreManager().getTxDataMap();
         Map txData = (Map)txDataMap.get(tx);
  @@ -162,11 +177,13 @@
            txDataMap.put(tx, txData);
         }
         
  -      JDBCRelationMetaData relationMetaData = 
cmrField.getMetaData().getRelationMetaData();
  +      JDBCRelationMetaData relationMetaData = 
  +            cmrField.getMetaData().getRelationMetaData();
         RelationData relationData = (RelationData)txData.get(relationMetaData);
         if(relationData == null)
         {
  -         relationData = new RelationData(cmrField, cmrField.getRelatedCMRField());
  +         relationData = new RelationData(
  +               cmrField, cmrField.getRelatedCMRField());
            txData.put(relationMetaData, relationData);
         }
         return relationData;
  @@ -222,45 +239,18 @@
            // This is an independent point of entry. We need to make sure the
            // thread is associated with the right context class loader
            ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
  -         Thread.currentThread().setContextClassLoader(container.getClassLoader());
  +         Thread.currentThread().setContextClassLoader(
  +               container.getClassLoader());
            
            try
            {
               // Get the manager
  -            CMPPersistenceManager cmpPM = 
(CMPPersistenceManager)container.getPersistenceManager();
  -            JDBCStoreManager manager = 
(JDBCStoreManager)cmpPM.getPersistenceStore();
  +            CMPPersistenceManager cmpPM = 
  +                  (CMPPersistenceManager)container.getPersistenceManager();
  +            JDBCStoreManager manager = 
  +                  (JDBCStoreManager)cmpPM.getPersistenceStore();
               
  -            // Save each relation
  -            Map txDataMap = manager.getTxDataMap();
  -            Map txData = (Map)txDataMap.get(tx);
  -            if(txData != null)
  -            {
  -               Iterator iterator = txData.values().iterator();
  -               while(iterator.hasNext())
  -               {
  -                  Object obj = iterator.next();
  -                  if(obj instanceof RelationData)
  -                  {
  -                     RelationData relationData = (RelationData) obj;
  -                     
  -                     // only need to bother if neither side has a foreign key
  -                     if(!relationData.getLeftCMRField().hasForeignKey() &&
  -                     !relationData.getRightCMRField().hasForeignKey())
  -                     {
  -                        
  -                        // delete all removed pairs from relation table
  -                        manager.deleteRelations(relationData);
  -                        
  -                        // insert all added pairs into the relation table
  -                        manager.insertRelations(relationData);
  -                        
  -                        relationData.addedRelations.clear();
  -                        relationData.removedRelations.clear();
  -                        relationData.notRelatedPairs.clear();
  -                     }
  -                  }
  -               }
  -            }
  +            manager.synchronizeRelationData(tx);
            } catch (Exception e)
            {
               log.error("ex", e);
  
  
  
  1.10      +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRemoveEntityCommand.java
  
  Index: JDBCRemoveEntityCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRemoveEntityCommand.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JDBCRemoveEntityCommand.java      2001/11/29 20:40:05     1.9
  +++ JDBCRemoveEntityCommand.java      2001/12/01 21:55:05     1.10
  @@ -30,7 +30,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.9 $
  + * @version $Revision: 1.10 $
    */
   public class JDBCRemoveEntityCommand implements RemoveEntityCommand {
      
  @@ -76,10 +76,11 @@
         int rowsAffected = 0;
         try {
            // get the connection
  -         DataSource dataSource = manager.getDataSource();
  +         DataSource dataSource = entity.getDataSource();
            con = dataSource.getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + removeEntitySQL);
            ps = con.prepareStatement(removeEntitySQL);
            
            // set the parameters
  
  
  
  1.10      +132 -24   
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStartCommand.java
  
  Index: JDBCStartCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStartCommand.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JDBCStartCommand.java     2001/11/29 19:09:15     1.9
  +++ JDBCStartCommand.java     2001/12/01 21:55:05     1.10
  @@ -12,6 +12,7 @@
   import java.sql.ResultSet;
   import java.sql.Statement;
   import java.sql.SQLException;
  +import java.util.HashSet;
   import javax.sql.DataSource;
   import javax.ejb.EJBException;
   
  @@ -32,7 +33,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Michel de Groot</a>
  - * @version $Revision: 1.9 $
  + * @version $Revision: 1.10 $
    */
   public class JDBCStartCommand implements StartCommand {
   
  @@ -40,8 +41,9 @@
      private JDBCEntityBridge entity;
      private JDBCEntityMetaData entityMetaData;
      private Logger log;
  -   private boolean alreadyCreated = false;
      
  +   private HashSet createdTables = new HashSet();
  +
      public JDBCStartCommand(JDBCStoreManager manager) {
         this.manager = manager;
         entity = manager.getEntityBridge();
  @@ -55,36 +57,51 @@
      }
   
      public void execute() throws Exception {
  -      // Create table if necessary
  -      if(!alreadyCreated || entityMetaData.getCreateTable()) {
  -         createTable(
  -               manager.getDataSource(),
  -               entityMetaData.getTableName(),
  -               getEntityCreateTableSQL());
   
  -         alreadyCreated = true;
  -      } 
  -
  +      // Create table if necessary
  +      if(!entity.getTableExists()) {
  +         if(entityMetaData.getCreateTable()) {
  +            createTable(
  +                  entity.getDataSource(),
  +                  entity.getTableName(),
  +                  getEntityCreateTableSQL());
  +         } else {
  +            log.debug("Table not create as requested: " +
  +                  entity.getTableName());
  +         }
  +         entity.setTableExists(true);
  +      }
  +     
         // create relation tables
         JDBCCMRFieldBridge[] cmrFields = entity.getJDBCCMRFields();
         for(int i=0; i<cmrFields.length; i++) {
            JDBCRelationMetaData relationMetaData = 
                  cmrFields[i].getRelationMetaData();
   
  -         if(relationMetaData.isTableMappingStyle() &&
  -            !relationMetaData.getTableExists()) {
  -            
  -            if(relationMetaData.getCreateTable()) {
  -               createTable(
  -                     relationMetaData.getDataSource(),
  -                     relationMetaData.getTableName(),
  -                     getRelationCreateTableSQL(cmrFields[i]));
  -            } else {
  -               log.info("Table not create as requested: " +
  -                     relationMetaData.getTableName());
  +         // if the table for the related entity has been created
  +         if(cmrFields[i].getRelatedEntity().getTableExists()) {
  +
  +            // create the relation table
  +            if(relationMetaData.isTableMappingStyle() &&
  +               !relationMetaData.getTableExists()) {
  +               
  +               if(relationMetaData.getCreateTable()) {
  +                  createTable(
  +                        relationMetaData.getDataSource(),
  +                        relationMetaData.getTableName(),
  +                        getRelationCreateTableSQL(cmrFields[i]));
  +               } else {
  +                  log.debug("Relation table not create as requested: " +
  +                        relationMetaData.getTableName());
  +               }
               }
  -            
               relationMetaData.setTableExists(true);
  +
  +            // Create my fk constraint
  +            addForeignKeyConstraint(cmrFields[i]);
  +
  +            // Create related fk constraint
  +            addForeignKeyConstraint(cmrFields[i].getRelatedCMRField());
            }
         }
      }
  @@ -121,6 +138,7 @@
   
            // success
            log.info("Created table '" + tableName + "' successfully.");
  +         createdTables.add(tableName);
         } catch (Exception e) {
            log.debug("Could not create table " + tableName, e);
            try {
  @@ -186,7 +204,8 @@
                  sql.append(SQLUtil.getColumnNamesClause(
                           entity.getJDBCPrimaryKeyFields()));
               sql.append(")");
  -         }   
  +         }
  +
         sql.append(")");
         
         return sql.toString();
  @@ -224,5 +243,94 @@
         sql.append(")");
         
         return sql.toString();
  +   }
  +
  +   private void addForeignKeyConstraint(JDBCCMRFieldBridge cmrField) {
  +      if(cmrField.getMetaData().hasForeignKeyConstraint()) {
  +      
  +         if(cmrField.getRelationMetaData().isTableMappingStyle()) {
  +            addForeignKeyConstraint(
  +                  cmrField.getRelationMetaData().getDataSource(),
  +                  cmrField.getRelationMetaData().getTableName(),
  +                  cmrField.getTableKeyFields(),
  +                  cmrField.getEntity().getTableName(),
  +                  cmrField.getEntity().getJDBCPrimaryKeyFields());
  +
  +         } else if(cmrField.hasForeignKey()) {
  +            addForeignKeyConstraint(
  +                  cmrField.getEntity().getDataSource(),
  +                  cmrField.getEntity().getTableName(),
  +                  cmrField.getForeignKeyFields(),
  +                  cmrField.getRelatedEntity().getTableName(),
  +                  cmrField.getRelatedEntity().getJDBCPrimaryKeyFields());
  +         }
  +      } else {
  +         log.debug("Foreign key constaint not added as requested: " + 
  +               "relationshipRolename=" +
  +               cmrField.getMetaData().getRelationshipRoleName());
  +      }
  +
  +   }
  +
  +   private void addForeignKeyConstraint(
  +         DataSource dataSource,
  +         String tableName,
  +         JDBCCMPFieldBridge[] fields,
  +         String referencesTableName,
  +         JDBCCMPFieldBridge[] referencesFields) {
  +
  +      // can only alter tables we created
  +      if(!createdTables.contains(tableName)) {
  +         return;
  +      }
  +
  +      StringBuffer sql = new StringBuffer(100);
  +
  +      sql.append("ALTER TABLE ").append(tableName);
  +      sql.append(" ADD CONSTRAINT fk").append(tableName);
  +      
  +      
  +      sql.append(" FOREIGN KEY (");
  +         sql.append(SQLUtil.getColumnNamesClause(fields));
  +      sql.append(")");
  +            
  +      sql.append(" REFERENCES ").append(referencesTableName);
  +      sql.append("(");
  +         sql.append(SQLUtil.getColumnNamesClause(referencesFields));
  +      sql.append(")");
  +
  +      Connection con = null;
  +      Statement statement = null;
  +      try {
  +         // since we use the pools, we have to do this within a transaction
  +         manager.getContainer().getTransactionManager().begin();
  +
  +         // get the connection
  +         con = dataSource.getConnection();
  +         
  +         // create the statement
  +         statement = con.createStatement();
  +         
  +         // execute sql
  +         log.debug("Executing SQL: " + sql);
  +         statement.executeUpdate(sql.toString());
  +
  +         // commit the transaction
  +         manager.getContainer().getTransactionManager().commit();
  +
  +         // success
  +         log.info("Added foreign key constriant to table '" + tableName);
  +      } catch (Exception e) {
  +         log.debug("Could not add foreign key constriant to table " + 
  +               tableName, e);
  +         try {
  +            manager.getContainer().getTransactionManager().rollback ();
  +         } catch (Exception _e) {
  +            log.error("Could not roll back transaction: ", e);
  +         }
  +      } finally {
  +         JDBCUtil.safeClose(statement);
  +         JDBCUtil.safeClose(con);
  +      }
      }
   }
  
  
  
  1.6       +2 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStopCommand.java
  
  Index: JDBCStopCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStopCommand.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- JDBCStopCommand.java      2001/11/28 11:32:54     1.5
  +++ JDBCStopCommand.java      2001/12/01 21:55:05     1.6
  @@ -28,7 +28,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Rickard �berg</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
  - * @version $Revision: 1.5 $
  + * @version $Revision: 1.6 $
    */
   public class JDBCStopCommand implements StopCommand {
   
  @@ -52,7 +52,7 @@
      public void execute() {
         if(entityMetaData.getRemoveTable()) {
            log.debug("Droping table for entity " + entity.getEntityName());
  -         dropTable(manager.getDataSource(), entityMetaData.getTableName());
  +         dropTable(entity.getDataSource(), entityMetaData.getTableName());
         }
   
         // drop relation tables
  
  
  
  1.8       +3 -2      
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreEntityCommand.java
  
  Index: JDBCStoreEntityCommand.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreEntityCommand.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JDBCStoreEntityCommand.java       2001/11/28 11:32:54     1.7
  +++ JDBCStoreEntityCommand.java       2001/12/01 21:55:05     1.8
  @@ -28,7 +28,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Joe Shevland</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Justin Forder</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Sebastien Alborini</a>
  - * @version $Revision: 1.7 $
  + * @version $Revision: 1.8 $
    */
   public class JDBCStoreEntityCommand implements StoreEntityCommand {
      private JDBCStoreManager manager;
  @@ -68,9 +68,10 @@
         int rowsAffected  = 0;
         try {
            // get the connection
  -         con = manager.getDataSource().getConnection();
  +         con = entity.getDataSource().getConnection();
            
            // create the statement
  +         log.debug("Executing SQL: " + sql);
            ps = con.prepareStatement(sql.toString());
            
            // set the parameters
  
  
  
  1.16      +31 -21    
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreManager.java
  
  Index: JDBCStoreManager.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreManager.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- JDBCStoreManager.java     2001/11/29 18:42:23     1.15
  +++ JDBCStoreManager.java     2001/12/01 21:55:05     1.16
  @@ -21,9 +21,6 @@
   import javax.ejb.EJBException;
   import javax.ejb.FinderException;
   import javax.ejb.RemoveException;
  -import javax.sql.DataSource;
  -import javax.naming.InitialContext;
  -import javax.naming.NamingException;
   import javax.transaction.Transaction;
   import javax.transaction.TransactionManager;
   
  @@ -64,7 +61,7 @@
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
    * @see org.jboss.ejb.EntityPersistenceStore
  - * @version $Revision: 1.15 $
  + * @version $Revision: 1.16 $
    */
   public class JDBCStoreManager implements EntityPersistenceStore2 {
   
  @@ -82,7 +79,6 @@
      private JDBCEntityMetaData metaData;
      private JDBCEntityBridge entityBridge;
   
  -   private DataSource dataSource;
      private JDBCTypeFactory typeFactory;
      private JDBCQueryManager queryManager;
   
  @@ -151,13 +147,6 @@
         return entityBridge;
      }
   
  -   /**
  -    * Returns the datasource for this entity.
  -    */
  -   public DataSource getDataSource() {
  -      return dataSource;
  -   }
  -
      public JDBCTypeFactory getJDBCTypeFactory() {
         return typeFactory;
      }
  @@ -186,15 +175,6 @@
   
         metaData = loadJDBCEntityMetaData();
   
  -      // find the datasource
  -      try {
  -         dataSource = (DataSource)new InitialContext().lookup(
  -               metaData.getDataSourceName());
  -      } catch(NamingException e) {
  -         throw new DeploymentException("Error: can't find data source: " + 
  -               metaData.getDataSourceName());
  -      }
  -
         // setup the type factory, which is used to map java types to sql types.
         typeFactory = new JDBCTypeFactory(
               metaData.getTypeMapping(), 
  @@ -391,7 +371,37 @@
   
      public void storeEntity(EntityEnterpriseContext ctx) {
         storeEntityCommand.execute(ctx);
  +      synchronizeRelationData(ctx.getTransaction());
      }
  +
  +   public void synchronizeRelationData(Transaction tx) {
  +      Map txDataMap = getTxDataMap();
  +      Map txData = (Map)txDataMap.get(tx);
  +      if(txData != null) {
  +         Iterator iterator = txData.values().iterator();
  +         while(iterator.hasNext()) {
  +            Object obj = iterator.next();
  +            if(obj instanceof RelationData) {
  +               RelationData relationData = (RelationData) obj;
  +               
  +               // only need to bother if neither side has a foreign key
  +               if(!relationData.getLeftCMRField().hasForeignKey() &&
  +               !relationData.getRightCMRField().hasForeignKey()) {
  +                  
  +                  // delete all removed pairs from relation table
  +                  deleteRelations(relationData);
  +                  
  +                  // insert all added pairs into the relation table
  +                  insertRelations(relationData);
  +                  
  +                  relationData.addedRelations.clear();
  +                  relationData.removedRelations.clear();
  +                  relationData.notRelatedPairs.clear();
  +               }
  +            }
  +         }
  +      }
  +   }   
   
      public void passivateEntity(EntityEnterpriseContext ctx) {
         passivateEntityCommand.execute(ctx);
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to