【问题标题】:Oracle 11g + Hibernate -> ORA-01461: can bind a LONG value only for insert into a LONG columnOracle 11g + Hibernate -> ORA-01461:只能绑定 LONG 值以插入 LONG 列
【发布时间】:2013-06-01 15:27:42
【问题描述】:

日志中有错误提示:

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

真的没有其他有用的信息。我试图跟进代码,google-d问题,我想我可能已经找到了问题,但不幸的是我没有Oracle数据库或任何东西(即使代码不存在于我,我正在写所有这些都来自记忆和笔记:() 因此,根据代码(以及大量谷歌搜索),我唯一能猜到的是到 varchar2 的字符串映射。 一些环境信息:

Hibernate: 3.2.1.ga
Driver: ojdbc6-11.2.0.2.0.jar
Database: 11.2.0.2.0 - 64bit

该表有多个 varchar2(300 字节)和一个 varchar2(4000 字节),我们称之为最后一个 TEXT。我检查了实体,在它的列注释中,这些字段的值限制为 300 字节,即使是 TEXT(4000 字节)字段!所以这是一个奇怪的点。我的疯狂猜测是出现了一个大于 300 字节的字符串,这是在尝试持久化时打印到日志中的错误(代码尝试持久化该实体实例的堆栈跟踪点)。可悲的是,我只有那个日志可以继续.. :( 我的猜测可能吗?或者它会是别的什么?

这里是实体字段:

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

这里是创建语句(无论如何是必不可少的部分):

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")
   );

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

【问题讨论】:

  • 听起来像一个 Hibernate 错误/问题。你使用的是正确的休眠方言吗?
  • 我认为你应该使用org.hibernate.dialect.Oracle10gDialect,因为OracleDialect 已被弃用:docs.jboss.org/hibernate/core/3.2/api/org/hibernate/dialect/…
  • 谢谢,我会尽快尝试的。
  • 更改方言并没有解决问题,但是如果我尝试插入比架构中的限制更大的字符串,我会收到错误消息。我猜我们将不得不使用 clob 或用 Java 编写检查。

标签: java oracle hibernate jpa oracle11g


【解决方案1】:

所以,大于 4000 字节的字符串是个问题。我们将列更改为 CLOB,这应该可以解决它。如果字符文字小于 4000 字节,它仍然会像 varchar2(4000) 一样存储在 Oracle 中。

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2014-09-20
    • 2017-08-29
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2014-08-09
    相关资源
    最近更新 更多