处理遗留数据库时,Hibernate会对丢失的行进行扼流

我正在尝试在遗留数据库(仍然有一个遗留的PHP客户端)上实现hibernate,并且遇到了一些问题,因为编写原始应用程序的人不知道他们在做什么。

设置数据库使得所有列都不可为空,因此如果没有记录,则默认外键为0。 此外,它们在表上没有正确的外键,因此有一些具有无效ID。 我没有选项来更改架构或null相应的列。

这是我从hibernate得到的错误:

Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0] 

我想要的是一种优雅的方式来处理这个问题,如果该行无效或不存在,该字段将为空,但我没有运气找到如何在文档中处理这个问题。

有小费吗?

注释:@NotFound(action = NotFoundAction.IGNORE)

完全是我在找什么。 我在这里找到了它:

Hibernate多对一外键默认值0

我认为Hibernate不适合这类问题。 Hibernate希望表中的记录彼此相关,如果外键关系有时只是强制执行,那么它实际上是行不通的。 我无法想象改变或配置Hibernate以这种方式行事会很容易 – 知道如何处理破坏的外键关系。

您可以从像MyBatis SQLMaps这样的框架中获得更多的利益 ,在该框架中,您提供SQL语句以将数据加载到程序外部的文件中,但框架提供了将SELECT语句链接在一起以加载完整对象图的选项。 这样,您可以使用逻辑来补充SQL语句以过滤掉0值。

我认为拦截器可能会成功。

我最近为具有类似问题的遗留数据库编写了一个webapp。 如果您不想使用多个数据访问框架,您仍然可以使用hibernate。 我所做的是使用’createSqlQuery’为棘手的部分写出本机SQL查询。 在某些情况下,我必须将完整的子查询或计算值映射到实体属性,但它可以工作。 对于更常规的数据库部分,我仍然可以使用常规的Hibernate映射和条件/ HQL查询。

另一件事:也许你应该避免使用诸如“不知道他们在做什么”或“捣蛋”这样的术语。 我知道很容易将前辈们留给你的任何代码看作是次等的,但要意识到这些人可能在当时做得最好。 此外,你自己的代码也没有完美无瑕,所以有些谦虚到位。 为什么? 首先,你周围的人可能会和你相处得更好,如果你不是一直在为他们认为非常有知识的先前开发人员喋喋不休地说话。 只是一个提示。