我正在尝试在遗留数据库(仍然有遗留的PHP客户端)上实现hibernate,并且遇到了一些问题,因为编写原始应用程序的人不知道他们在做什么。
设置数据库使得所有列都不可为空,因此如果没有记录,则将外键默认为0。此外,它们在表上没有正确的外键,因此有一些具有无效ID。我没有选项来更改架构或使相应的列无效。
这是我从休眠中获得的错误:
Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0]
我想要的是一种优雅的方式来处理这个问题,如果该行无效或不存在,该字段将为空,但我没有运气找到如何在文档中处理这个问题。
任何提示?
答案 0 :(得分:16)
注释: @NotFound(action = NotFoundAction.IGNORE)
完全符合我的要求。我在这里找到了它:
答案 1 :(得分:2)
我认为Hibernate不适合这类问题。 Hibernate希望表中的记录彼此相关,如果只是有时强制执行外键关系,那么它实际上是行不通的。我无法想象改变或配置Hibernate会很容易 以这种方式行事 - 知道如何处理破碎的外键关系。
您可以从MyBatis SQLMaps这样的框架中获得更多的收益,在这个框架中,您提供SQL语句以将数据加载到程序外部的文件中,但框架提供了链接SELECT
语句的选项一起加载完整的对象图。这样,您可以使用逻辑来补充SQL语句,以过滤掉0
值。
答案 2 :(得分:1)
我认为interceptor可能会成功。
答案 3 :(得分:0)
我最近为具有类似问题的旧数据库编写了一个webapp。如果您不想使用多个数据访问框架,您仍然可以使用hibernate。我所做的是使用'createSqlQuery'为棘手的部分写出本机SQL查询。在某些情况下,我必须将完整的子查询或计算值映射到实体属性,但它可以工作。对于更常规的数据库部分,我仍然可以使用常规的Hibernate映射和条件/ HQL查询。
另一件事:也许你应该避免使用诸如“不知道他们在做什么”或“捣蛋”这样的术语。我知道很容易将前辈们留给你的任何代码看作是次等的,但要意识到这些人可能在当时做得最好。而且,你自己的代码也没有完美无瑕,所以有些谦虚到位。为什么?首先,你周围的人可能会和你相处得更好,如果你不是一直在为他们认为非常有知识的先前开发人员喋喋不休地说话。只是一个提示。