gpt4 book ai didi

oracle - Hibernate 的 saveOrUpdate 忽略非空列属性

转载 作者:行者123 更新时间:2023-12-04 02:52:36 25 4
gpt4 key购买 nike

我有一个映射文件,将给定的列指定为 not-null="true" .这是一个错误,因为表的列设置为 NULL在 Oracle 数据库上。但是直到现在,在创建映射文件一年多之后,我们才注意到这一点,因为 Hibernate 一直在“忽略”这一点。这可能吗?

为了更清楚。在数据库上:

CREATE TABLE db.my_table<br/>
(...)<br/>
my_column NUMBER(10,0) NULL,
(...)

在映射文件上:

<column name="MY_COLUMN" precision="10" scale="0" not-null="true">

然后在Java代码上:

getHibernateTemplate().saveOrUpdate(myEntity);

getHibernateTemplate().flush();

此代码在我们的环境中运行。一直以来。但一些客户遇到了 ot-null property references a null or transient value 的问题当我调试代码时,它没有任何意义。据我所知,这段代码应该永远无法运行。

当然,解决客户的问题很简单,我只需更正映射文件,使其正确代表我的实体。但这里真正的问题是为什么 Hibernate 没有提示它?

我在这里问过其他一些在 Hibernate 方面有更多经验的工程师,但他们都没有见过这个。

所以,谁能给我点提示?

编辑: 只是想强调一下,我们的测试环境和我的客户都运行完全相同的代码,并且在这两种情况下都是 myEntity对象具有 myColumn属性设置为 NULL .所以,让我感到困惑的是,为什么它不会在我们的环境中产生任何异常。

最佳答案

这是绝对正确的行为。

not-null 属性有两个含义:

  • 支持模式导出工具
  • 在运行时检查实体(即不检查数据库列设置)

参见:5.1. Mapping declaration , 摘录:

The mapping document also contains some extra optional attributes and elements that affect the database schemas exported by the schema export tool (for example, the not-null attribute).

5.1.11. Property , 摘录:

not-null (optional): enables the DDL generation of a nullability constraint for the columns.

因此,如果您的客户运行一些代码,它会尝试:

getHibernateTemplate().saveOrUpdate(myEntity);

虽然 myEntity 缺少一些设置为 not-null="true" 的属性,但抛出运行时异常是正确的。在您的测试环境中,您很可能总是将属性设置为一些而不是空值。

甚至还有优势。 DB 和 App 是松散耦合的。因此,如果需要,您可以在不接触数据库的情况下在 App 端进行更多限制(例如,您不被允许)

关于oracle - Hibernate 的 saveOrUpdate 忽略非空列属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17351801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com