diff --git a/base/src/org/compiere/model/MTable.java b/base/src/org/compiere/model/MTable.java index ccee6b8cb2..c1a398573e 100644 --- a/base/src/org/compiere/model/MTable.java +++ b/base/src/org/compiere/model/MTable.java @@ -594,7 +594,7 @@ public class MTable extends X_AD_Table return null; // PO po = null; - POInfo info = POInfo.getPOInfo(getCtx(), getAD_Table_ID()); + POInfo info = POInfo.getPOInfo(getCtx(), getAD_Table_ID(), trxName); if (info == null) return null; StringBuffer sqlBuffer = info.buildSelect(); sqlBuffer.append(" WHERE ").append(whereClause); diff --git a/base/src/org/compiere/model/PO.java b/base/src/org/compiere/model/PO.java index f00ac664a4..aec8a4e918 100644 --- a/base/src/org/compiere/model/PO.java +++ b/base/src/org/compiere/model/PO.java @@ -115,6 +115,8 @@ public abstract class PO if (ctx == null) throw new IllegalArgumentException ("No Context"); p_ctx = ctx; + m_trxName = trxName; + p_info = initPO(ctx); if (p_info == null || p_info.getTableName() == null) throw new IllegalArgumentException ("Invalid PO Info - " + p_info); @@ -122,7 +124,7 @@ public abstract class PO int size = p_info.getColumnCount(); m_oldValues = new Object[size]; m_newValues = new Object[size]; - m_trxName = trxName; + if (rs != null) load(rs); // will not have virtual columns else diff --git a/base/src/org/compiere/model/POInfo.java b/base/src/org/compiere/model/POInfo.java index a4b10925f0..dca0f2f3a2 100644 --- a/base/src/org/compiere/model/POInfo.java +++ b/base/src/org/compiere/model/POInfo.java @@ -42,6 +42,18 @@ public class POInfo implements Serializable * @return POInfo */ public static POInfo getPOInfo (Properties ctx, int AD_Table_ID) + { + return getPOInfo(ctx, AD_Table_ID, null); + } + + /** + * POInfo Factory + * @param ctx context + * @param AD_Table_ID AD_Table_ID + * @param trxName Transaction name + * @return POInfo + */ + public static POInfo getPOInfo (Properties ctx, int AD_Table_ID, String trxName) { Integer key = new Integer(AD_Table_ID); POInfo retValue = (POInfo)s_cache.get(key); @@ -67,11 +79,23 @@ public class POInfo implements Serializable * @param baseLanguageOnly get in base language */ private POInfo (Properties ctx, int AD_Table_ID, boolean baseLanguageOnly) + { + this(ctx, AD_Table_ID, baseLanguageOnly, null); + } + + /************************************************************************** + * Create Persistent Info + * @param ctx context + * @param AD_Table_ID AD_ Table_ID + * @param baseLanguageOnly get in base language + * @param trxName transaction name + */ + private POInfo (Properties ctx, int AD_Table_ID, boolean baseLanguageOnly, String trxName) { m_ctx = ctx; m_AD_Table_ID = AD_Table_ID; boolean baseLanguage = baseLanguageOnly ? true : Env.isBaseLanguage(m_ctx, "AD_Table"); - loadInfo (baseLanguage); + loadInfo (baseLanguage, trxName); } // PInfo /** Context */ @@ -91,8 +115,9 @@ public class POInfo implements Serializable /** * Load Table/Column Info * @param baseLanguage in English + * @param trxName */ - private void loadInfo (boolean baseLanguage) + private void loadInfo (boolean baseLanguage, String trxName) { ArrayList<POInfoColumn> list = new ArrayList<POInfoColumn>(15); StringBuffer sql = new StringBuffer(); @@ -116,9 +141,10 @@ public class POInfo implements Serializable if (!baseLanguage) sql.append(" AND e.AD_Language='").append(Env.getAD_Language(m_ctx)).append("'"); // + PreparedStatement pstmt = null; try { - PreparedStatement pstmt = DB.prepareStatement(sql.toString(), null); + pstmt = DB.prepareStatement(sql.toString(), trxName); pstmt.setInt(1, m_AD_Table_ID); ResultSet rs = pstmt.executeQuery(); while (rs.next()) @@ -158,13 +184,23 @@ public class POInfo implements Serializable IsTranslated, IsEncrypted); list.add(col); } - rs.close(); - pstmt.close(); + rs.close(); } catch (SQLException e) { CLogger.get().log(Level.SEVERE, sql.toString(), e); } + finally + { + if( pstmt != null) + { + try + { + pstmt.close(); + } + catch (SQLException e) {} + } + } // convert to array m_columns = new POInfoColumn[list.size()]; list.toArray(m_columns); diff --git a/base/src/org/compiere/model/POIterator.java b/base/src/org/compiere/model/POIterator.java index b72e7ee711..26eed6c70c 100644 --- a/base/src/org/compiere/model/POIterator.java +++ b/base/src/org/compiere/model/POIterator.java @@ -94,7 +94,7 @@ public class POIterator implements Iterator<PO> { } else { if (keyWhereClause == null) { String[] keys = table.getKeyColumns(); - POInfo info = POInfo.getPOInfo(Env.getCtx(), table.getAD_Table_ID()); + POInfo info = POInfo.getPOInfo(Env.getCtx(), table.getAD_Table_ID(), trxName); if (info == null) return null; StringBuffer sqlBuffer = info.buildSelect(); sqlBuffer.append(" WHERE "); diff --git a/base/src/org/compiere/model/Query.java b/base/src/org/compiere/model/Query.java index 217ec4748e..705326562d 100644 --- a/base/src/org/compiere/model/Query.java +++ b/base/src/org/compiere/model/Query.java @@ -89,7 +89,7 @@ public class Query { public List<PO> list() throws SQLException { List<PO> list = new ArrayList<PO>(); - POInfo info = POInfo.getPOInfo(Env.getCtx(), table.getAD_Table_ID()); + POInfo info = POInfo.getPOInfo(Env.getCtx(), table.getAD_Table_ID(), trxName); if (info == null) return null; StringBuffer sqlBuffer = info.buildSelect(); if (whereClause != null && whereClause.trim().length() > 0) @@ -210,7 +210,7 @@ public class Query { * @throws SQLException */ public POResultSet scroll() throws SQLException { - POInfo info = POInfo.getPOInfo(Env.getCtx(), table.getAD_Table_ID()); + POInfo info = POInfo.getPOInfo(Env.getCtx(), table.getAD_Table_ID(), trxName); if (info == null) return null; StringBuffer sqlBuffer = info.buildSelect(); if (whereClause != null && whereClause.trim().length() > 0)