You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by mr...@apache.org on 2026/10/27 07:34:24 UTC

(ofbiz-framework) branch release24.09 updated: Store and read blob fields as bytes on binary columns

This is an automated email from the ASF dual-hosted git repository.

mridulpathak pushed a commit to branch release24.09
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/release24.09 by this push:
     new 29827c4109 Store and read blob fields as bytes on binary columns
29827c4109 is described below

commit 29827c4109c653edc0ad592dc78dd71aa364e50a
Author: Mridul Pathak <mr...@gmail.com>
AuthorDate: Tue Oct 27 12:09:32 2026 +0530

    Store and read blob fields as bytes on binary columns
    
    On PostgreSQL the blob field type is a BYTEA column, but the PostgreSQL JDBC driver maps setBlob and getBlob to large objects, so storing a Blob failed with "column is of type bytea but expression is of type bigint" and reading one failed with "Bad value for type long". When the column's SQL type is binary, the blob value handler now binds the value with setBytes and reads it back with getBytes wrapped in a SerialBlob. Other databases keep using setBlob and getBlob.
---
 .../apache/ofbiz/entity/jdbc/JdbcValueHandler.java   | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java b/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java
index 07f582cd6d..295b1fc6c2 100644
--- a/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java
+++ b/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java
@@ -339,12 +339,30 @@ public abstract class JdbcValueHandler<T> {
         public Class<Object> getJavaClass() {
             return Object.class;
         }
+        /**
+         * Returns true when the column is a binary type (like PostgreSQL BYTEA) rather than a BLOB.
+         * Some drivers, like PostgreSQL's, map the JDBC Blob methods to large objects, which cannot
+         * be used with such a column, so the value is passed as bytes instead.
+         */
+        private boolean isBinaryColumn() {
+            int sqlType = getSqlType();
+            return sqlType == Types.BINARY || sqlType == Types.VARBINARY || sqlType == Types.LONGVARBINARY;
+        }
         @Override
         protected void castAndSetValue(PreparedStatement ps, int parameterIndex, Object obj) throws SQLException {
-            ps.setBlob(parameterIndex, (Blob) obj);
+            Blob blob = (Blob) obj;
+            if (isBinaryColumn()) {
+                ps.setBytes(parameterIndex, blob.getBytes(1, (int) blob.length()));
+            } else {
+                ps.setBlob(parameterIndex, blob);
+            }
         }
         @Override
         public Object getValue(ResultSet rs, int columnIndex) throws SQLException {
+            if (isBinaryColumn()) {
+                byte[] bytes = rs.getBytes(columnIndex);
+                return bytes != null ? new SerialBlob(bytes) : null;
+            }
             Blob fieldBlob = rs.getBlob(columnIndex);
             if (fieldBlob != null) {
                 return new SerialBlob(fieldBlob);