From e03262481396bc5246ef21e50234a84cd2085764 Mon Sep 17 00:00:00 2001 From: "Richard G. Curtis" Date: Mon, 15 Aug 2011 21:54:40 +0000 Subject: [PATCH] OPENJPA-2039: Update configuration properties. git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@1158027 13f79535-47bb-0310-9956-ffa450edef68 --- .../DelegatingJDBCFetchConfiguration.java | 17 +++++++++++++++++ .../jdbc/kernel/JDBCFetchConfiguration.java | 16 ++++++++++++++++ .../jdbc/kernel/JDBCFetchConfigurationImpl.java | 10 ++++++++++ .../openjpa/jdbc/kernel/JDBCStoreManager.java | 7 +------ .../openjpa/persistence/jdbc/JDBCFetchPlan.java | 16 ++++++++++++++++ .../persistence/jdbc/JDBCFetchPlanImpl.java | 12 ++++++++++-- .../jdbc/kernel/TestJDBCStoreOptSelect.java | 14 +++++++++----- 7 files changed, 79 insertions(+), 13 deletions(-) diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/DelegatingJDBCFetchConfiguration.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/DelegatingJDBCFetchConfiguration.java index 317671ef7..96080b49d 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/DelegatingJDBCFetchConfiguration.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/DelegatingJDBCFetchConfiguration.java @@ -294,4 +294,21 @@ public class DelegatingJDBCFetchConfiguration throw translate(re); } } + @Override + public void setIgnoreDfgForFkSelect(boolean b) { + try { + getJDBCDelegate().setIgnoreDfgForFkSelect(b); + } catch (RuntimeException re) { + throw translate(re); + } + } + + @Override + public boolean getIgnoreDfgForFkSelect() { + try { + return getJDBCDelegate().getIgnoreDfgForFkSelect(); + } catch (RuntimeException re) { + throw translate(re); + } + } } diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfiguration.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfiguration.java index 9156db645..95cf43c43 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfiguration.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfiguration.java @@ -241,4 +241,20 @@ public interface JDBCFetchConfiguration * @since 1.0.3 */ public JDBCFetchConfiguration addFetchInnerJoins(Collection fields); + + /** + * If true - Ignore whether or not a field is in the dfg for mappings that use 2-part selects to load fk table data. + * + * @since 2.2.0 + * @return false + */ + public boolean getIgnoreDfgForFkSelect(); + + /** + * If true - Ignore whether or not a field is in the dfg for mappings that use 2-part selects to load fk table data. + * + * @since 2.2.0 + * @return false + */ + public void setIgnoreDfgForFkSelect(boolean b); } diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfigurationImpl.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfigurationImpl.java index 990a69a80..2540aca68 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfigurationImpl.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCFetchConfigurationImpl.java @@ -92,6 +92,7 @@ public class JDBCFetchConfigurationImpl public Set joins = null; public Set fetchInnerJoins = null; public int isolationLevel = -1; + public boolean ignoreDfgForFkSelect = false; } protected final JDBCConfigurationState _state; @@ -135,8 +136,17 @@ public class JDBCFetchConfigurationImpl setLRSSize(jf.getLRSSize()); setJoinSyntax(jf.getJoinSyntax()); addJoins(jf.getJoins()); + setIgnoreDfgForFkSelect(jf.getIgnoreDfgForFkSelect()); } + @Override + public boolean getIgnoreDfgForFkSelect() { + return _state.ignoreDfgForFkSelect; + } + @Override + public void setIgnoreDfgForFkSelect(boolean b) { + _state.ignoreDfgForFkSelect = b; + } public int getEagerFetchMode() { return _state.eagerMode; } diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java index b24525f7a..4f0fe36c1 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreManager.java @@ -111,7 +111,6 @@ public class JDBCStoreManager implements StoreManager, JDBCStore { private RefCountConnection _conn = null; private boolean _active = false; private Log _log = null; - boolean _ignoreDfgForFkSelect = false; // track the pending statements so we can cancel them private Set _stmnts = Collections.synchronizedSet(new HashSet()); @@ -1410,7 +1409,7 @@ public class JDBCStoreManager implements StoreManager, JDBCStore { */ private boolean optSelect(FieldMapping fm, Select sel, OpenJPAStateManager sm, JDBCFetchConfiguration fetch) { boolean dfg = - _ignoreDfgForFkSelect || + fetch.getIgnoreDfgForFkSelect() || !fm.isInDefaultFetchGroup() && !fm.isDefaultFetchGroupExplicit(); return dfg && (sm == null || sm.getPCState() == PCState.TRANSIENT || !sm.getLoaded().get(fm.getIndex())) @@ -1551,10 +1550,6 @@ public class JDBCStoreManager implements StoreManager, JDBCStore { ? getConfiguration().getFinderCacheInstance() : null; } - public void setIgnoreDfgForFkSelect(boolean b) { - _ignoreDfgForFkSelect = b; - } - /** * Connection returned to client code. Makes sure its wrapped connection ref count is decremented on finalize. */ diff --git a/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java b/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java index 68378139e..3e5f6d381 100644 --- a/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java +++ b/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java @@ -227,4 +227,20 @@ public interface JDBCFetchPlan * @deprecated use {@link #setJoinSyntax(JoinSyntax)} instead. */ public JDBCFetchPlan setJoinSyntax(int syntax); + + /** + * If true - Ignore whether or not a field is in the dfg for mappings that use 2-part selects to load fk table data. + * + * @since 2.2.0 + * @return false + */ + public boolean getIgnoreDfgForFkSelect(); + + /** + * If true - Ignore whether or not a field is in the dfg for mappings that use 2-part selects to load fk table data. + * + * @since 2.2.0 + * @return false + */ + public void setIgnoreDfgForFkSelect(boolean b); } diff --git a/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlanImpl.java b/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlanImpl.java index bb9d23ccc..0b2018ce4 100644 --- a/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlanImpl.java +++ b/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlanImpl.java @@ -20,8 +20,6 @@ package org.apache.openjpa.persistence.jdbc; import java.sql.ResultSet; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; import javax.persistence.LockModeType; @@ -343,4 +341,14 @@ public class JDBCFetchPlanImpl public JDBCFetchPlan setQueryTimeout(int timeout) { return (JDBCFetchPlan) super.setQueryTimeout(timeout); } + + @Override + public boolean getIgnoreDfgForFkSelect() { + return _fetch.getIgnoreDfgForFkSelect(); + } + + @Override + public void setIgnoreDfgForFkSelect(boolean b) { + _fetch.setIgnoreDfgForFkSelect(b); + } } diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/TestJDBCStoreOptSelect.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/TestJDBCStoreOptSelect.java index dabab8adb..d6b583870 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/TestJDBCStoreOptSelect.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/TestJDBCStoreOptSelect.java @@ -27,10 +27,12 @@ import org.apache.openjpa.meta.MetaDataRepository; import org.apache.openjpa.persistence.EntityManagerImpl; import org.apache.openjpa.persistence.FetchPlan; import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI; +import org.apache.openjpa.persistence.jdbc.JDBCFetchPlan; import org.apache.openjpa.persistence.test.SQLListenerTestCase; public class TestJDBCStoreOptSelect extends SQLListenerTestCase { - Object[] props = new Object[] { CLEAR_TABLES, OptSelectEntity.class }; + Object[] props = new Object[] { CLEAR_TABLES, OptSelectEntity.class + }; OptSelectEntity e1, e2; @Override @@ -50,10 +52,11 @@ public class TestJDBCStoreOptSelect extends SQLListenerTestCase { if (store instanceof JDBCStoreManager == false) { fail("StoreManager is not an instanceof JDBCStoreManager"); } - // Set this JDBCStoreManager property so that we will select FKs for fields that are in the DFG, but not - // included in the current select. - ((JDBCStoreManager) store).setIgnoreDfgForFkSelect(true); - + // Set this JDBCFetchPlan property so that we will select FKs for fields that are in the DFG, but not + // included in the current load. If this property isn't set, the FK for eagerOneToOneOwner will not be + // selected. + ((JDBCFetchPlan)fp).setIgnoreDfgForFkSelect(true); + // Remove all relationships fp.removeField(OptSelectEntity.class, "eagerOneToOne"); fp.removeField(OptSelectEntity.class, "eagerOneToOneOwner"); @@ -77,6 +80,7 @@ public class TestJDBCStoreOptSelect extends SQLListenerTestCase { fks++; } } + // We expected to find 2 FKs. One for each of the owners (lazyOneToOneOwner and eagerOneToOneOwner) assertEquals(2, fks); } finally { if (em.getTransaction().isActive()) {