Author: mriou
Date: Wed Jul 29 23:15:00 2009
New Revision: 799119

URL: http://svn.apache.org/viewvc?rev=799119&view=rev
Log:
ODE-628 Some DBMS (like Ingres) don't support update on queries with join, we 
have to use subqueries instead

Modified:
    
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/SessionManager.java
    
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionFactoryImpl.java
    
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/CorrelatorDaoImpl.java

Modified: 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/SessionManager.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/SessionManager.java?rev=799119&r1=799118&r2=799119&view=diff
==============================================================================
--- 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/SessionManager.java 
(original)
+++ 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/SessionManager.java 
Wed Jul 29 23:15:00 2009
@@ -25,6 +25,7 @@
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
 
 import javax.sql.DataSource;
 import javax.transaction.TransactionManager;
@@ -48,9 +49,13 @@
   private static final Map<String, DataSource> _dataSources = 
     Collections.synchronizedMap(new HashMap<String,DataSource>());
 
+  private static final String[] CANNOT_JOIN_FOR_UPDATE_DIALECTS =
+    {"org.hibernate.dialect.IngresDialect"};
+
   private final String _uuid = new UUID().toString();
   private final TransactionManager _txManager;
   private final SessionFactory _sessionFactory;
+  private boolean _canJoinForUpdate = true;
 
   /** Inaccessible constructor. */
   public SessionManager(Properties env, DataSource ds, TransactionManager tx) 
throws HibernateException {
@@ -65,12 +70,35 @@
             .setProperties(env)
             .setProperty(PROP_GUID, _uuid)
             .buildSessionFactory();
+      /*
+      Some Hibernate dialects (like IngresDialect) do not support update for 
join.
+      We need to distinguish them and explicitly define subqueries, otherwise 
Hibernate
+      implicitly generates joins which causes problems during update for such 
DBMS.
+      See org.apache.ode.daohib.bpel.CorrelatorDaoImpl for instance.
+      */
+    String currentHibDialect = env.getProperty(Environment.DIALECT);
+    for (String dialect : CANNOT_JOIN_FOR_UPDATE_DIALECTS) {
+        if (dialect.equals(currentHibDialect)) {
+            _canJoinForUpdate = false;
+        }
+    }
   }
 
   TransactionManager getTransactionManager() {
     return _txManager;
   }
 
+    /**
+     * Returns flag which shows whether " where .. join ... for update" kind 
of queries can be used (supported
+     * by currently effective {...@link org.hibernate.dialect.Dialect}. If 
it's {...@code false} than sub-query fallback
+     * should be invoked instead.
+     *
+     * @return currently returns false only for {...@link 
org.hibernate.dialect.IngresDialect}
+     */
+  public boolean canJoinForUpdate() {
+    return _canJoinForUpdate;
+  }
+
   /**
    * Get the current Hibernate Session.
    */

Modified: 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionFactoryImpl.java?rev=799119&r1=799118&r2=799119&view=diff
==============================================================================
--- 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionFactoryImpl.java
 (original)
+++ 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionFactoryImpl.java
 Wed Jul 29 23:15:00 2009
@@ -169,6 +169,8 @@
                 "org.hibernate.dialect.DerbyDialect"));
         HIBERNATE_DIALECTS.put("H2", new 
DialectFactory.VersionInsensitiveMapper(
                 "org.hibernate.dialect.H2Dialect"));
+        HIBERNATE_DIALECTS.put("INGRES", new 
DialectFactory.VersionInsensitiveMapper(
+                "org.hibernate.dialect.IngresDialect"));
     }
 
     public void shutdown() {

Modified: 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/CorrelatorDaoImpl.java
URL: 
http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/CorrelatorDaoImpl.java?rev=799119&r1=799118&r2=799119&view=diff
==============================================================================
--- 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/CorrelatorDaoImpl.java
 (original)
+++ 
ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/CorrelatorDaoImpl.java
 Wed Jul 29 23:15:00 2009
@@ -56,6 +56,10 @@
     /** filter for finding a matching selector. */
     private static final String FLTR_SELECTORS = ("from " + 
HCorrelatorSelector.class.getName()
             + " hs where hs.correlationKey = ? and hs.processType = ? and 
hs.correlator.correlatorId = ?").intern();
+    private static final String FLTR_SELECTORS_SUBQUERY = ("from  " + 
HCorrelatorSelector.class.getName()
+            + " hs where hs.correlationKey = ? and hs.processType = ? and 
hs.correlatorId = " +
+            "(select hc.id from " + HCorrelator.class.getName() + " hc where 
hc.correlatorId = ? )").intern();
+
 
     private static final String LOCK_SELECTORS = "update from " + 
HCorrelatorSelector.class.getName() +
         " set lock = lock+1 where correlationKey = ? and processType = 
?".intern();
@@ -121,7 +125,7 @@
         lockQry.setString(1, processType);
         if (lockQry.executeUpdate() > 0) {
             
-            Query q = getSession().createQuery(FLTR_SELECTORS);
+            Query q = getSession().createQuery(_sm.canJoinForUpdate() ? 
FLTR_SELECTORS : FLTR_SELECTORS_SUBQUERY);
             q.setString(0, key == null ? null : key.toCanonicalString());
             q.setString(1, processType);
             q.setString(2, _hobj.getCorrelatorId());


Reply via email to