Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (revision 639433) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (working copy) @@ -127,8 +127,8 @@ public static final String CONS_NAME_MID = "mid"; public static final String CONS_NAME_AFTER = "after"; - public int blobBufferSize = 50; - public int clobBufferSize = 50; + public int blobBufferSize = 50000; + public int clobBufferSize = 50000; protected static final int RANGE_POST_SELECT = 0; protected static final int RANGE_PRE_DISTINCT = 1; @@ -4140,16 +4140,24 @@ return column.toString(); } - public void insertBlobForStreamingLoad(Row row, Column col) + public void insertBlobForStreamingLoad(Row row, Column col, Object ob) throws SQLException { - row.setBinaryStream(col, - new ByteArrayInputStream(new byte[0]), 0); + if (ob != null) { + row.setBinaryStream(col, + new ByteArrayInputStream(new byte[0]), 0); + } else { + row.setNull(col); + } } - public void insertClobForStreamingLoad(Row row, Column col) + public void insertClobForStreamingLoad(Row row, Column col, Object ob) throws SQLException { + if (ob != null) { row.setCharacterStream(col, new CharArrayReader(new char[0]), 0); + } else { + row.setNull(col); + } } public void updateBlob(Select sel, JDBCStore store, InputStream is) Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java (revision 639433) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java (working copy) @@ -1091,13 +1091,17 @@ buf.append("')"); } - public void insertBlobForStreamingLoad(Row row, Column col) + public void insertBlobForStreamingLoad(Row row, Column col, Object ob) throws SQLException { + if (ob == null) + col.setType(Types.OTHER); row.setNull(col); } - public void insertClobForStreamingLoad(Row row, Column col) + public void insertClobForStreamingLoad(Row row, Column col, Object ob) throws SQLException { + if (ob == null) + col.setType(Types.OTHER); row.setNull(col); } } Index: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/LobFieldStrategy.java =================================================================== --- openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/LobFieldStrategy.java (revision 639433) +++ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/LobFieldStrategy.java (working copy) @@ -80,18 +80,12 @@ (field.getIndex()), store); Row row = field.getRow(sm, store, rm, Row.ACTION_INSERT); if (field.getColumnIO().isInsertable(0, ob == null)) { - if (ob != null) { - if (isBlob()) { - store.getDBDictionary().insertBlobForStreamingLoad - (row, field.getColumns()[0]); - } else { - store.getDBDictionary().insertClobForStreamingLoad - (row, field.getColumns()[0]); - } + if (isBlob()) { + store.getDBDictionary().insertBlobForStreamingLoad + (row, field.getColumns()[0], ob); } else { - Column col = field.getColumns()[0]; - col.setType(Types.OTHER); - row.setNull(col); + store.getDBDictionary().insertClobForStreamingLoad + (row, field.getColumns()[0], ob); } } } @@ -113,12 +107,32 @@ } } } + + public Boolean isCustomUpdate(OpenJPAStateManager sm, JDBCStore store) { + return null; + } public void update(OpenJPAStateManager sm, JDBCStore store, RowManager rm) throws SQLException { Object ob = toDataStoreValue(sm.fetchObjectField - (field.getIndex()), store); + (field.getIndex()), store); if (field.getColumnIO().isUpdatable(0, ob == null)) { + Row row = field.getRow(sm, store, rm, Row.ACTION_UPDATE); + if (isBlob()) { + store.getDBDictionary().insertBlobForStreamingLoad + (row, field.getColumns()[0], ob); + } else { + store.getDBDictionary().insertClobForStreamingLoad + (row, field.getColumns()[0], ob); + } + } + } + + public void customUpdate(OpenJPAStateManager sm, JDBCStore store) + throws SQLException { + Object ob = toDataStoreValue(sm.fetchObjectField + (field.getIndex()), store); + if (field.getColumnIO().isUpdatable(0, ob == null)) { if (ob != null) { Select sel = createSelect(sm, store); if (isBlob()) { @@ -128,11 +142,6 @@ store.getDBDictionary().updateClob (sel, store, (Reader)ob); } - } else { - Row row = field.getRow(sm, store, rm, Row.ACTION_UPDATE); - Column col = field.getColumns()[0]; - col.setType(Types.OTHER); - row.setNull(col); } } } @@ -191,4 +200,5 @@ sel.setLob(true); return sel; } + } Index: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java =================================================================== --- openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java (revision 639433) +++ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java (working copy) @@ -20,6 +20,7 @@ package org.apache.openjpa.jdbc.meta.strats; import java.io.IOException; + import javax.persistence.EntityManager; import javax.persistence.Query; @@ -117,6 +118,41 @@ em.close(); } + public void testUpdateWithNull() { + if (!isDatabaseSupported()) return; + insert(newLobEntity("oOOOOOo", 1)); + EntityManager em = emf.createEntityManager(); + em.getTransaction().begin(); + LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1); + entity.setStream(null); + em.getTransaction().commit(); + em.close(); + em = emf.createEntityManager(); + em.getTransaction().begin(); + entity = (LobEntity) em.find(getLobEntityClass(), 1); + assertNull(entity.getStream()); + em.getTransaction().commit(); + em.close(); + } + + public void testUpdateANullObjectWithoutNull() throws IOException { + if (!isDatabaseSupported()) return; + insert(newLobEntity(null, 1)); + EntityManager em = emf.createEntityManager(); + em.getTransaction().begin(); + LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1); + String string = "iIIIIIi"; + changeStream(entity, string); + em.getTransaction().commit(); + em.close(); + em = emf.createEntityManager(); + em.getTransaction().begin(); + entity = (LobEntity) em.find(getLobEntityClass(), 1); + assertEquals(string, getStreamContentAsString(entity.getStream())); + em.getTransaction().commit(); + em.close(); + } + public void testDelete() { if (!isDatabaseSupported()) return; insert(newLobEntity("oOOOOOo", 1)); Index: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/ReaderLobEntity.java =================================================================== --- openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/ReaderLobEntity.java (revision 639433) +++ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/ReaderLobEntity.java (working copy) @@ -35,10 +35,10 @@ public class ReaderLobEntity implements LobEntity { @Id - int id; + private int id; @Persistent - Reader stream; + private Reader stream; public int getId() { return id;