我有三个数据库视图,它们在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不使用哈希函数,也不显示这种特殊行为 - 这意味着哈希必须负责。
有谁知道为什么?
答案 0 :(得分:0)
我们找到了原因: 子视图B使用其所有(包含内容)列作为散列函数的字符串连接。 这包括日期字段,在创建字符串时未明确格式化。
因此,当从视图中选择Hibernate时,它显然使用了另一种格式而不是SQL Developer,因此产生了完全不同(但一致)的ID。
明确格式化已用日期字段可以解决问题。