【问题标题】:Hibernate: how to deal with PropertyAccessException (invalid data)?Hibernate:如何处理 PropertyAccessException(无效数据)?
【发布时间】:2018-11-09 12:22:33
【问题描述】:

假设我有一个 FOO 类型字段的实体,但外部进程将无效值 BAR 写入数据库。所以下次我尝试用 Hibernate 读取这个实体时,我会遇到这样的异常:

org.hibernate.PropertyAccessException: 无法通过反射设置字段值 [BAR] 值

不幸的是,当我调用 getAllFoo() 方法并且数据库包含 999 个有效实体和一个无效实体时,我也遇到了这个异常。我希望能够获得 999 个有效实体以及针对无效实体的某种警告。

这在 Hibernate 中是否可行?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我能想到 3 个选项:

    (1):对这个表+字段的所有查询添加WHERE field IN(<list of valid values>)子句。

    (2):清理数据库并为字段添加约束,这样就不会出现无效值。

    (3):将无效选项(我假设它是一个枚举?)添加到您的实体,并在自己的代码中将其过滤掉。这可能会破坏查询的正确分页。如果你有大量的无效值,它也会很快变得混乱。

    编辑

    (4):创建自定义休眠类型(UserType)。在那里,您可以从准备好的语句/结果集中手动解析值。这允许您(而不是引发异常)将“无效”值映射到 null 或您可以处理的任何其他有意义的值。

    【讨论】:

    • 一般来说是好的建议,但在我的情况下有一些陷阱:(1)有效值的列表是无限的。 (2) 该字段是 GEOMETRY(通过 PostGIS)并且可以包含任何形状(例如 POLYGON 或 LINESTRING 甚至 EMPTY COLLECTION)。不过,我的实体类需要一个 LINESTRING。因此无法在数据库中验证这一点,因为 GEOMETRY 类型过于笼统且内部复杂。 (3) 是的,或者甚至将我实体中的字段设为 GEOMETRY,然后手动验证它。但我的问题是具体是否可以处理异常。
    • 另一个想法:为这个字段创建一个自定义的休眠类型。并且在解析它时(手动,从结果集中),当遇到无效值时将其映射到null。这将允许您保留 999 个有效项和 1 个无效项的结果,其中该字段将为空。我将更新我的答案以包含此选项。
    • UserType 是个好主意,因为它允许我在不牺牲实体中强类型的情况下避免异常。我会将其标记为已回答。
    猜你喜欢
    • 2018-01-12
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2015-03-01
    • 2010-12-12
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多