当前位置: 首页 > 面试题库 >

Hibernate> CLOB> Oracle :(

董花蜂
2023-03-14
问题内容

我试图将一个超过4000个字符的值写入Oracle Clob字段。这似乎是一个普遍的问题,但是似乎没有解决方案可以奏效。所以我从这里祈祷寻求帮助。

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

在我的persistence.xml中,我有:

<persistence-unit name="DWEB" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.archive.autodetection" value="class"/> 
        <property name="hibernate.connection.password" value="###" />
        <property name="hibernate.connection.username" value="###" />
        <property name="hibernate.default_schema" value="schema" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test_period" value="3000" />
        <property name="show_sql" value="true" />
        <property name="format_sql" value="true" />
        <property name="use_sql_comments" value="true" />
        <property name="SetBigStringTryClob" value="true"/>
        <property name="hibernate.jdbc.batch_size" value="0"/>
        <property name="hibernate.connection.url" value="jdbc:oracle:thin:@server.ss.com:1521:DDD"/>
        <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
    </properties>
</persistence-unit>

该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)
...

如果我需要提供更多信息,请询问。一切工作直到超过可怕的限制。


问题答案:

感谢非续集者的所有帮助。我已经完成了这项工作,并确定了所有内容,以备将来参考。不管所有关于升级驱动程序的主张,一切都会奏效,但对我而言,一切都不奏效。最后,我必须实现一个“
org.hibernate.usertype.UserType”,我将其命名为与Web
StringClobType上的所有示例相同。除了一些导入,我使用了“ 在Oracle和Hibernate中使用Clobs /
Blobs”中的示例。就我而言,请忽略“提防”声明。

为了使合并生效,我必须进行一项更改。所提供的代码示例中未实现某些方法。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中,持久性单元声明如下所示:

<persistence-unit name="###" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.archive.autodetection" value="class"/> 
        <property name="hibernate.connection.password" value="###" />
        <property name="hibernate.connection.username" value="###" />
        <property name="hibernate.connection.url" value="jdbc:oracle:thin:@server.something.com:1521:###"/>
        <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
        <property name="hibernate.default_schema" value="###" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="100" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test period" value="3000" />
        <property name="hibernate.c3p0.idle_connection_test_period" value="300" />
        <property name="show_sql" value="false" />
        <property name="format_sql" value="false" />
        <property name="use_sql_comments" value="false" />
        <property name="hibernate.jdbc.batch_size" value="0"/>
    </properties>
</persistence-unit>

SetBigStringTryClob从来没有为我工作,并且此最终实现不需要它。

我吸取的教训是,最终加入战斗可能会更好。它将为我节省三天。



 类似资料:
  • //大家好。我的问题是我不能在clob字段中写大日期。curentli我可以写长度不大于4000的字符串。你能解释一下为什么我不能写clob到clob字段。我正在使用: Oracle数据库11g企业版11.2.0.1.0 列表项hibernate 4.2.6.final 列表项ojdbc 11.1.0.7.0 我的恩典是: 我更新entety的代码: 我尝试了几种方法来创建Clob:

  • 问题内容: 关于谷歌搜索,可以找到很多东西,但是我还没有找到解决这个问题的可行方法。 基本上,我想按需加载的特定类上有一个很大的CLOB。天真的方法是: 但是,这不起作用,显然是由于我使用的是oracle驱动程序,即Lob对象没有被视为简单的句柄,而是始终被加载。如此一来,我就被我的尝试所吸引。有一种解决方案使用特殊的工具来进行惰性属性加载,但是由于Hibernate文档似乎表明他们对使它正常工作

  • 我们的项目需要同时支持Oracle和Postgres DBS。并且可能会有更多的数据库添加到此列表中。因此需要为BLOB和CLOB数据类型提供一个与DB无关的Hibernate配置。 而Oracle正在与以下方面进行良好的合作: Postgres也开始抱怨。 研究发现,人们建议使用和进行注释。这两个都是Hibernate注释。但是,我们打算使用JPA注释,这需要在运行时使用Hibernate,在我

  • 我在使用Hibernate读取oracle数据库时遇到困难。列为clob类型,映射类属性为String类型。数据库是Oracle 11g。我曾尝试按照一些帖子的建议更新我的驱动程序,但没有用。问题是,所有其他列(不是clob的列)都被正确读取,而clob的列除了有数据外,还返回null。提前道谢。 查询是: 从Details中选择id,about_us,other_details,periodic

  • 下面的示例将演示如何在Spring JDBC的帮助下使用Update Query更新CLOB。 我们将更新学生表中的可用记录。 学生表 CREATE TABLE Student( ID INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, DESCRIPTION LONGTE

  • 下面的示例将演示如何在Spring JDBC的帮助下使用Update Query更新CLOB。 我们将更新学生表中的可用记录。 学生表 CREATE TABLE Student( ID INT NOT NULL AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, DESCRIPTION LONGTE