【问题标题】:Hibernate chokes on missing rows when dealing with a legacy database在处理遗留数据库时,Hibernate 会因丢失的行而窒息
【发布时间】:2011-04-26 18:58:14
【问题描述】:

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

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

这是我从休眠中得到的错误:

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

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

有什么建议吗?

【问题讨论】:

    标签: java mysql hibernate legacy-database


    【解决方案1】:

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

    完全符合我的要求。我是通过这里找到的:

    Hibernate Many-To-One Foreign Key Default 0

    【讨论】:

    • 我正在寻找的起点。对于 Hibernate 映射文件,属性为 not-found1(例如:<many-to-one ... not-found="ignore" />
    【解决方案2】:

    我认为 Hibernate 不适合解决这类问题。 Hibernate 期望您的表中的记录相互关联,并且如果仅有时强制执行外键关系,则实际上无法工作。我无法想象更改或配置 Hibernate 会很容易 以这种方式行事 - 知道如何处理损坏的外键关系。

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

    【讨论】:

    • 感谢您的建议,但我坚持使用休眠模式。到目前为止,我已经找到了 decent 解决方法,但如果我能捕获该特定异常并将该字段设为空,那就太好了。
    【解决方案3】:

    我认为interceptor 可以解决问题。

    【讨论】:

    • 我检查了拦截器,除了几个使用它们创建审计日志的示例之外,它似乎有点过于笼统。我在别处列出的注释最终达到了我想要的效果。
    【解决方案4】:

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

    另一件事:也许您应该避免使用诸如“不知道他们在做什么”或“搞砸”之类的术语。我知道将前辈留给您的任何代码都视为低劣的想法很诱人,但要意识到这些人当时可能已经尽力而为。此外,你自己的代码也不是完美无缺的,所以有些谦虚。为什么?一方面,如果您不总是对他们认为知识渊博的以前的开发人员喋喋不休,那么您周围的人可能会与您相处得更好一些。只是一个提示。

    【讨论】:

    • 你怎么能确定我没有?也许是我写的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2013-05-25
    • 2020-05-13
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多