我正在使用一个大型的旧数据库,现在我尝试使用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?
答案 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