Oracle 11g + Hibernate-> ORA-01461:只能为插入到LONG列而绑定LONG值

Rev*_*lit 3 java oracle hibernate jpa oracle11g

日志中显示错误:

ORA-01461:只能绑定LONG值才能插入LONG列

确实没有其他有用的信息。我试图跟进代码,用google-d解决问题,我想我可能已经找到了问题,但是不幸的是我没有Oracle数据库或其他任何东西(即使代码不存在,我在写所有这些都来自内存和注释:()因此,我只能基于代码(以及大量的搜索)来猜测,是String映射到varchar2。一些环境信息:

Hibernate: 3.2.1.ga
Driver: ojdbc6-11.2.0.2.0.jar
Database: 11.2.0.2.0 - 64bit
Run Code Online (Sandbox Code Playgroud)

该表具有多个varchar2(300字节)和一个varchar2(4000字节),让我们称之为最后一个TEXT。我检查了实体,并在其列注释中,这些字段的值(甚至是TEXT(4000字节))的限制为300字节!这是一个奇怪的观点。我的疯狂猜测是,字符串来了,大于300 BYTE,这是尝试持久化时的错误记录(在堆栈跟踪点,代码试图持久化此实体的实例)。可悲的是,我只有那个日志可以继续下去..:((我的猜测是否可能?或者还会有其他事情吗?

这是实体字段:

@Column(name = "TEXT", nullable = false, length = varcharLength)
public String getText() {
    return text;
}
Run Code Online (Sandbox Code Playgroud)

这是create语句(无论如何都是必不可少的部分):

CREATE TABLE "TABLENAME" 
   (
   "ID" VARCHAR2(300 BYTE) NOT NULL ENABLE, 
   "VERSION" NUMBER(10,0), 
   "TEXT" VARCHAR2(4000 BYTE) NOT NULL ENABLE, 
   "PUBLISH_DATE" DATE NOT NULL ENABLE, 
   PRIMARY KEY ("ID")
   );
Run Code Online (Sandbox Code Playgroud)

(并且该表在PUBLISH_DATE有一个索引,如果该索引是完全相关的。)

Rev*_*lit 5

因此,使用更大的String而不是4000字节是一个问题。我们将该列更改为CLOB,这应该可以解决它。而且,如果字符文字小于4000字节,则仍将其存储在Oracle中,就像是varchar2(4000)一样。