Java Hibernate在多通关系中处理长0值而不是NULL

Java Hibernate在多通关系中处理长0值而不是NULL,java,hibernate,null,zero,Java,Hibernate,Null,Zero,我使用Hibernate访问遗留数据库。对于某些表,不强制执行父子引用完整性,并且对子表中的某些“父”列使用long0值而不是NULL,以表示“无父” 我仍然希望在@ManyToOne和@OneToMany字段中使用这些关系,但由于0值与主表中的任何记录都不对应,因此获取EntityNotFound错误 我的选项是什么?您可以将其映射到默认值为空的java.lang.Long。或者您可以使用@PostLoad并在0时将其设为空。您还可以使用@公式并忽略0 在其中编写的@公式可用于连接条件 因为我

我使用Hibernate访问遗留数据库。对于某些表,不强制执行父子引用完整性,并且对子表中的某些“父”列使用
long
0值而不是NULL,以表示“无父”

我仍然希望在
@ManyToOne
@OneToMany
字段中使用这些关系,但由于0值与主表中的任何记录都不对应,因此获取
EntityNotFound
错误


我的选项是什么?

您可以将其映射到默认值为空的
java.lang.Long
。或者您可以使用
@PostLoad
并在
0
时将其设为空。您还可以使用
@公式
并忽略
0

在其中编写的
@公式
可用于
连接条件

因为我不知道你的数据模型,提供一个有效的例子是很棘手的。尝试:

id_fk is not null or id_fk <> 0
id\u fk不为null或id\u fk 0
街区

如果它不适合你的需要,你可以自己写

如果使用某种日志记录,请启用
show\u sql
属性。并将
org.hibernate.sql
DEBUG

添加到配置中使用注释:

@NotFound(action = NotFoundAction.IGNORE)

请参见

代替@JoinColumn可用于@JoinFormula。像这样

@JoinFormula(value="CASE the0isNullColumn WHEN 0 THEN NULL ELSE the0isNullColumn END")

表达式表示我们检查列,如果为0,则返回NULL。然后hibernate不会搜索相关实体。

@公式需要有效的SQL表达式。能否提供表达式以将0替换为NULL?我不需要将字段映射到java.lang.Long。我需要将这些字段映射到实体类@ManyToOne。我只是无法使JoinColumnOrFormula正常工作。我在这里放了一个bug报告。如果没有其他选项,我将尝试Loader annotation。启用日志并粘贴SQL。此解决方法解决了我的问题。但我仍然希望Hibernate强制所有非零键值的引用完整性。Hibernate不强制引用完整性。数据库是这样做的。外键约束应该存在,但由于这些0值行的原因,它当然不可能存在。Hibernate将无法神奇地强制执行引用完整性,即使是数据库也无法强制执行。如果将此列映射为关联,我不知道如何创建一个不指向任何内容的非零值。这是一个带有未记录方案的遗留数据库,这些引用由专有软件维护。目前我所知道的是允许0值作为键,而不是通常的空值。我认为这些关系仍然存在引用完整性,并且由专有软件维护,但是如果我的假设是错误的,我希望立即报告。正如我所说的,如果您将现有父级存储在子级中,Hibernate当然会使用父级ID填充列。所以我看不出你怎么能破坏引用完整性。专有软件,而不是我,可能会破坏代码。我怀疑这一点,因为我不知道作者为什么决定不强制某些列的引用完整性。顺便说一句,我试图添加@NotFound注释,但Hibernate似乎忽略了它(在AnnotationBinder.processElementAnnotations()方法中)。也许,Hibernate注释(与JPA注释相反)必须显式启用?