3

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

让它更清楚。在数据库上:

CREATE TABLE db.my_table
(...)
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. 所以,令我困惑的是为什么它不会在我们的环境中产生任何异常。

4

2 回答 2

3

这是绝对正确的行为。

not-null属性有两个含义:

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

见:5.1。映射声明,提取:

映射文档还包含一些额外的可选属性和元素,这些属性和元素会影响模式导出工具导出的数据库模式(例如,非空属性)。

5.1.11。属性,提取:

not-null(可选):启用 DDL 为列生成可空性约束。

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

getHibernateTemplate().saveOrUpdate(myEntity);

虽然myEntity缺少一些属性集,因为not-null="true"它在引发运行时异常时是正确的。在您的测试环境中,您很可能总是将属性设置为某个非空值。

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

于 2013-06-28T04:08:01.597 回答
1

我有完全相同的问题:

在我的休眠映射文件中,我设置not-null="true"了一个特殊列。

在我的开发机器上,我可以毫无例外地保留空值。在客户机器上,我们总是收到一个PropertyValueException / DataIntegrityViolationException.

这是一种危险的行为。手动和自动测试不会失败。

解决方案:

在我的开发机器上,我可以将属性设置hibernate.check_nullabilitytrue. 只有这样,我的开发系统才会出现异常。

结论

这种奇怪的行为可能来自添加hibernate validator到类路径中。这变成check_nullability了假的。请参阅此相关问题:如何启用 Spring 验证

不知何故,这只适用于我的开发系统而不是生产。这可能源于不同应用程序服务器中的不同依赖项加载。

于 2015-09-29T16:43:41.303 回答