[英]Unable to persist null into oracle BLOB using JPA
我正在嘗試使用JPA將圖像Byte[]
和調度程序TimerHandle
到oracle 11g數據庫(EclipseLink 2.3.x)
當該屬性的值不為null時,JPA可以將Byte [] / TimerHandle持久化到數據庫,但是當這些屬性為null
,它將給出此異常。
Caused by: java.lang.ClassCastException: oracle.sql.BLOB incompatible with oracle.sql.BLOB
at oracle.jdbc.driver.OraclePreparedStatement.setBlob(OraclePreparedStatement.java:6663)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setBlob(OraclePreparedStatementWrapper.java:128)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setBlob(DelegatingPreparedStatement.java:387)
at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.setBlob(LoggingConnectionDecorator.java:1499)
at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setBlob(DelegatingPreparedStatement.java:387)
at org.apache.openjpa.jdbc.sql.OracleDictionary.setNull(OracleDictionary.java:633)
at org.apache.openjpa.jdbc.sql.DBDictionary.setTyped(DBDictionary.java:1285)
at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:896)
at org.apache.openjpa.jdbc.sql.RowImpl.flush(RowImpl.java:856)
at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:117)
at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.batchOrExecuteRow(BatchingPreparedStatementManagerImpl.java:99)
at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:83)
at com.ibm.ws.persistence.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:63)
at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:100)
at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:88)
at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:550)
at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:106)
at org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59)
at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:105)
at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:78)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:737)
at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2178)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2076)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1847)
... 70 more
如何解決此問題,以便null
可以在數據庫中作為(null)持久化到數據庫?
我找到了部分解決方案...有此問題時,請使用純oracle.sql.BLOB而不是映射到BLOB的任何其他類。
@Entity
public class FileStorage implements Serializable {
@Id
private Long fileId;
@Lob
//private byte[] fileData; replaced this line with the line below.
private oracle.sql.BLOB fileData;
//Getter and setter
}
public class WorkingClass{
private EntityManager em;
public foo(){
FileStorage f = new FileStorage();
f.setFileData(BLOB.getEmptyBLOB());
//f.getFileData().setBytes(someByteArrayData);
em.persist(f);
}
}
public class ErrorClass{
private EntityManager em;
public foo(){
FileStorage f = new FileStorage();
f.setFileData();
//fail when the line below is commented
//f.setFileData(someByteArrayData);
em.persist(f);
}
}
但是現在問題困擾着TimerHandle
。 在使用ObjectOutputStream
/ ObjectInputStream
進行手動序列化和反序列化之后,計時器似乎未正確序列化,導致當我調用((TimerHandle) o).getTimer()
時導致NoSuchObjectLocalException
,甚至我確認計時器仍在運行(調用一個@Timeout方法,該方法不斷輸出一個消息)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.