Hibernate 治疗';0'&引用-1“;无效

Hibernate 治疗';0'&引用-1“;无效,hibernate,Hibernate,我正在处理一个大型的旧数据库,现在我尝试用hibernate而不是SQL来访问它。 其中一个较大的问题是在没有约束的foreignkey中使用“0”和“-1”(意思是“NULL”) 我生成了很多代码,但我手动添加了连接。像这样 @OneToMany(fetch = FetchType.EAGER) @JoinColumn(nullable = true, name = "fkActivityId") public List<Activity> getActivities() {

我正在处理一个大型的旧数据库,现在我尝试用hibernate而不是SQL来访问它。 其中一个较大的问题是在没有约束的foreignkey中使用“0”和“-1”(意思是“NULL”)

我生成了很多代码,但我手动添加了连接。像这样

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(nullable = true, name = "fkActivityId")
public List<Activity> getActivities() {
    return activities;
}
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(nullable=true,name=“fkActivityId”)
公共列表活动(){
返回活动;
}
问题是,只要有一个对象的fkActivityId=“-1”或“0”表示NULL,就会出现异常,抱怨找不到这样的对象


有没有办法让Hibernate表现得好像它是空的一样?

很抱歉,我知道它没有回答这个问题,但是如果你能够回答的话,效果会更好

update ExampleTable 
set fkActivityId = null 
where fkActivityId = 0 or fkActivityId = -1

检查数据库并将每个fkActivityId的值都更新为null(如果其值为-1或0)。这就是空值的作用。Hibernate正在正确地完成它的工作;数据库设置不正确。

Welbog关于修复数据的回答将是首选方法


如果您真的无法修复数据,您可以将混乱的布尔DB字段映射到java布尔值并返回。

我现在尝试了两种方法

我编写了一个NullableIDType扩展UserType,当数据包含“0”或“-1”时,它将返回null。就像丹文顿建议的(向上投票!)。但有一个问题。我必须将用户类型设置为引用模型的id

@Id 
@GeneratedValue
@Column(name = "pkID", unique = true, nullable = false, type = NullableIDType)
public Integer getPkId() {
    return this.pkId;
}
这将强制所有对该模型的引用使用“0”而不是“null”。 我忘了说,大多数情况下,null是在应该使用的时候使用的。 因此,如果数据库一直使用“0”而不是“null”,那么这将是可行的

然后是@NotFound(action=NotFoundAction.IGNORE)w

起初,这似乎是一个糟糕但有效的解决方案,直到我保存了一个空引用的东西。它在数据库中保存为“null”,然后导致其他代码崩溃,正如它预期的“0”

因此,为了使用hibernate连接,我必须在所有地方对null使用相同的值。别自以为是


对于我的问题,这并不是一个令人满意的答案。但它就是这样。

没有必要使用“或fkActivityId=null”,事实上,它并不像您想象的那样工作。用于空比较,=将始终产生false。很抱歉,我的意思是=-1,有固定答案有时候固定遗留数据并不是不回答问题的一种选择。有时修复数据不是一个选项(例如,在访问只读数据库时)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="fkProjectBereichId",nullable = true)
@NotFound(action=NotFoundAction.IGNORE)
public Projectbereich getProjektbereich() {
    return projektbereich;
}