【问题标题】:Hibernate and ORA-01400: cannot insert NULLHibernate 和 ORA-01400:无法插入 NULL
【发布时间】:2011-08-23 20:00:25
【问题描述】:

我有一个相当简单的场景,一张表,一个序列用于自动生成主键:

CREATE TABLE foo (event_id NUMBER(19,0)....
CREATE SEQUENCE event_seq

部分休眠映射如下所示:

...
<id name="id" column="EVENT_ID" type="long">
   <generator class="native">
      <param name="sequence">event_seq</param>
   </generator>
</id>
...

长时间运行良好,没有问题。但最近我得到了这个:

ORA-01400: cannot insert NULL into ("TESTING"."FOO"."EVENT_ID")

这是否意味着 Oracle 未能生成 EVENT_ID 的序列号? 这可能是什么原因?显然这个错误来自64位Oracle,它可能与问题有关吗?删除并重新创建表和序列并没有帮助,它只是不想在那台特定的机器上工作。无论我做什么,我都无法重现这一点,错误来自几乎无法访问的用户之一。

有什么想法吗?

--------------- 问题解决了 ---------------

在 32 位操作系统上使用驱动程序 10.2.0.1.0 时检测到 Oracle 10.2.0.1.0 64 位的原始问题。一旦驱动程序更新到 11.2.0.2.0,问题就消失了。这完全取决于虚拟机是作为 32 位还是 64 位系统运行的。

【问题讨论】:

  • 检查连接到数据库的用户(如您的应用服务器连接池中配置的)是否对序列具有适当的权限。如果没有,则授予他们:grant select on event_seq to &lt;&lt;user&gt;&gt;;

标签: oracle hibernate ora-01400


【解决方案1】:

Oracle 不会在表插入时自动生成序列号。您要么必须将其编码到插入中,将其编码到触发器中,要么让 hibernate 执行此操作。

我认为 hibernate 需要 &lt;generator class="sequence"&gt; 如果您希望它这样做,或者您的 hibernate 设置不再认为您正在处理 Oracle 数据库

【讨论】:

  • 它适用于我最初发布的生成器,但不适用于该特定机器。 EVENT_SEQ 索引被创建并递增,我试图像 Martin 建议的那样摆弄权限,但没有运气 - 最后一切正常。我使用 Oracle 10g express,问题机器也是 10g 但 64 位 ..,这是迄今为止我从日志中可以看出的唯一区别。
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 2017-09-01
  • 2013-02-21
  • 2016-08-21
  • 2016-06-21
  • 2015-06-04
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多