Hibernate显示的ID不同于DB

时间:2018-02-22 10:29:24

标签: oracle hibernate

我有三个数据库视图,它们在Hibernate中映射为实体。 这些实体处于亲子关系中(1个父母(A),2个孩子(B& C))。

其中一个子视图(B)使用Oracle的dbms_utility.get_hash_value()来计算其ID。 这是因为它对使用不同ID序列的几个表执行UNION,因此其中的ID可能不唯一。

我现在有一个非常令人费解的效果,一个简单的entityManager.find(B.class, id)无法找到合适的行。

当我通过加载的父(A)实体查看子项时,我可以看到B中显示的ID与数据库中的ID完全不同。如果我将此ID与entityManager.find(B.class, hibernateId)一起使用,Hibernate会找到合适的实体。

另一方面,数据库只在使用ID列中显示的ID时返回一个值(而不是显示ID Hibernate)。

子实体C不使用哈希函数,也不显示这种特殊行为 - 这意味着哈希必须负责。

有谁知道为什么?

1 个答案:

答案 0 :(得分:0)

我们找到了原因: 子视图B使用其所有(包含内容)列作为散列函数的字符串连接。 这包括日期字段,在创建字符串时未明确格式化。

因此,当从视图中选择Hibernate时,它显然使用了另一种格式而不是SQL Developer,因此产生了完全不同(但一致)的ID。

明确格式化已用日期字段可以解决问题。