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());