将'0',“ - 1”视为空

时间:2009-03-31 14:30:25

标签: hibernate

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

我生成了很多代码,但我手动添加了联接。喜欢这个

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(nullable = true, name = "fkActivityId")
public List<Activity> getActivities() {
    return activities;
}

问题是,只要我有一个fkActivityId =“ - 1”或“0”意味着NULL的对象,就会有一个异常抱怨无法找到这样的对象。

有没有办法让Hibernate表现得好像是NULL?

4 个答案:

答案 0 :(得分:2)

我现在尝试了两件事。

我编写了一个NullableIDType扩展UserType,当数据包含“0”或“-1”时,它将返回null。就像DanVinton所建议的那样(upvote!)。但有一个问题。我必须将UserType设置为引用模型的 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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="fkProjectBereichId",nullable = true)
@NotFound(action=NotFoundAction.IGNORE)
public Projectbereich getProjektbereich() {
    return projektbereich;
}

起初这看起来像是糟糕但有效的解决方案,直到我保存了一些有空参考的东西。它在数据库中保存为“null”,然后导致其他代码崩溃,因为它预期为“0”。

因此,为了使用hibernate连接,我必须在任何地方使用相同的null值。没办法。

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

答案 1 :(得分:1)

浏览数据库,如果其值为-1或0,则将每个fkActivityId更新为null。这就是null的用途。 Hibernate正确地完成了它的工作;它是未正确设置的数据库。

答案 2 :(得分:0)

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

如果你真的无法修复数据,可以write a custom value type将凌乱的布尔数据库字段映射到java布尔值并返回。

答案 3 :(得分:-1)

对不起,我知道它没有回答这个问题,但是如果能够的话,那就更好了。

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