Oracle 冬眠';s saveOrUpdate忽略not null列属性

Oracle 冬眠';s saveOrUpdate忽略not null列属性,oracle,hibernate,Oracle,Hibernate,我有一个映射文件,它将给定列指定为notnull=“true”。这是一个错误,因为表的列在Oracle数据库上设置为NULL。但是我们直到现在才注意到,在创建映射文件一年多之后,因为Hibernate一直在“忽略”这一点。可能吗 让它更清楚。在数据库上: 创建表db.my_表 (…) my_列编号(10,0)为空, (…) 在映射文件上: 然后在Java代码上: getHibernateTemplate().saveOrUpdate(myEntity) getHibernateTemplate

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

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

创建表db.my_表
(…)
my_列编号(10,0)为空, (…)

在映射文件上:

然后在Java代码上:

getHibernateTemplate().saveOrUpdate(myEntity)

getHibernateTemplate().flush()

此代码正在我们的环境中工作。一直都是。但是一些客户端出现了
otnull属性引用null或瞬态值的问题,当我调试代码时,它没有任何意义。据我所知,这段代码永远无法运行

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

我问过其他一些在Hibernate方面有更多经验的工程师,但他们中没有人见过这种情况

有人能给我一个提示吗


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

这是绝对正确的行为

notnull
属性有两种含义:

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

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

并摘录:

非空(可选):启用可空性的DDL生成 列的约束

因此,如果您的客户机运行一些代码,这将尝试:

getHibernateTemplate().saveOrUpdate(myEntity);
虽然
myEntity
缺少一些设置为
not null=“true”
的属性,但抛出运行时异常是正确的。在测试环境中,您很可能总是将属性设置为非空值


甚至还有一个优势。DB和App是松散耦合的。因此,如果需要,您可以在应用程序端设置更多约束,同时不接触数据库(例如,您不被允许)

我遇到了完全相同的问题:

在我的hibernate映射文件中,我为一个特殊列设置了
notnull=“true”

在我的开发机器上,我可以保持空值,没有任何异常。在客户机器上,我们始终收到
属性值异常/DataIntegrityViolationException

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

解决方案:

在我的开发机器上,我需要设置属性
hibernate。请将_nullability
设置为
true
。只有在那时,我的开发系统也出现了异常

结论

这种奇怪的行为可能来自将
hibernate验证器添加到类路径。这会将
check_nullability
变为false。 见这一相关问题:


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

这是一个bug。我想每个软件都有一个。它闻起来肯定像个bug。但我想知道为什么它不会发生在我们的环境中,而只发生在我们的客户机上。它对DDL有影响是有道理的,但是,另一方面,我感到困惑:调用
getHibernateTemplate().saveOrUpdate(myEntity)其中
myEntity
将属性映射到
MY_列
,并且
null
将产生运行时错误?如果存在映射:
not null=true
,并且实体具有null而不是值。。。它将以运行时错误结束。事实上,在例外情况下:notnull属性引用null或瞬态值OK,明白了!如果您的客户端运行一些代码,那么尝试:<代码> GeTeBiNeTeTeMeTeLe()。SaveOrror更新(MySt实体);< /Cord> >而<代码> MyType < /代码>缺少一些属性设置为<代码> NULL =“true”< /Cord>这是正确的。最后(粗体)部分让我感到困惑。我期望类似“抛出运行时异常是正确的”或类似的东西。无论如何,回答得好+1.非常感谢您的建议和帮助。我的英语仍然代表着我的捷克思维;)谢谢,我明白你的意思了。但是我们的环境和我的客户都运行完全相同的代码。在这里调试时,
myEntity
具有相同的属性sel to
NULL
,但它不会产生任何异常。这就是让我困惑的地方。我将编辑我的问题以强调这一点。