Hibernate> CLOB> Oracle :(

我试图写一个超过4000个字符的Oracle clob字段。 这种接缝是一个常见问题,但解决方案似乎不起作用。 所以我从这里寻求帮助。

肮脏的信息:
使用Oracle 9.2.0.8.0
Hibernate3使用注释实现pojo
Tomcat 6.0.16
Oracle 10.2.x驱动程序
C3P0连接池提供商

在我的persistence.xml中,我有:

 org.hibernate.ejb.HibernatePersistence                     

getter和setter看起来像:

 @Lob @Column(name="COMMENT_DOC") public String getDocument(){ return get("Document"); } public void setDocument(String s){ put("Document",s); } 

我得到的例外是:

 SEVERE: Servlet.service() for servlet SW threw exception java.sql.SQLException: Io exception: Software caused connection abort: socket write error at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:334) at oracle.jdbc.ttc7.TTC7Protocol.handleIOException(TTC7Protocol.java:3678) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1999) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1144) at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2152) at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2035) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2876) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:609) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2275) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2688) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:304) at org.sw.website.actions.content.AddComment.performAction(AddComment.java:60) ... 

如果我需要提供更多信息请求。 一切都有效,直到超过可怕的极限。

感谢非sequitor提供所有帮助。 我有这个工作,我想把所有的部分放在这里供将来参考。 无论关于升级驱动程序的所有声明如何,一切都会起作用,不是那些对我有用。 最后,我必须实现一个’org.hibernate.usertype.UserType’,我将其命名为与Web StringClobType上的所有示例相同。 除了一些导入,我使用了使用Clobs / Blob与Oracle和Hibernate的例子。 就我而言,忽略了“提防”的主张。

为了让合并工作,我必须做出一个改变。 某些方法未在提供的代码示例中实现。 Eclipse通过将它们删除来为我修复它。 很酷,但是需要实际实现replace方法,否则所有合并都会用null覆盖数据。 这是我的实施:

 public Object replace(Object newValue, Object existingValue, Object arg2)throws HibernateException { return newValue; } 

我不会在这里复制类实现转到上面的链接看看它。 我在第三个灰色框中使用了代码。 然后在pojo类的顶部我想使用它,我在导入后添加了以下内容

 ... import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDefs; import org.hibernate.annotations.TypeDef; @TypeDefs({ @TypeDef( name="clob", typeClass = foo.StringClobType.class ) }) @Entity @Table(name="EA_COMMENTS") public class Comment extends SWDataObject implements JSONString, Serializable { ... } 

然后使用新的UserType我将注释添加到我的getter:

 @Type(type="clob") @Column(name="COMMENT_DOC") public String getDocument(){ return get("Document"); } 

我不需要@Lob注释。
在我的persistence.xml中,持久性单元声明结束如下:

  org.hibernate.ejb.HibernatePersistence                     

SetBigStringTryClob对我来说从未起作用,并且最终实现不需要。

我从中吸取的教训是,最后加入战斗可能会更好。 它会救我三天。

我认为您的问题可能是您使用的是Oracle 9i但Hibernate方言是10g 。 确保您的驱动程序,数据库版本和方言都是同步的,因为还有一个9i方言org.hibernate.dialect.Oracle9iDialect

它应该是:

 true 0 

并不是:

 true 

并为您的数据库使用正确的方言( org.hibernate.dialect.Oracle9iDialect )。

还要确保使用最新的Oracle 10g第2版瘦驱动程序 (10.2.0.4)或更高版本。

我们过去遇到过类似的问题,LONG列而不是CLOB。 问题是JDBC驱动程序,我们现在使用的驱动程序和工作正常的alt文本http://img143.imageshack.us/img143/4263/20091204172213.png