【问题标题】:Spring hibernate - handling exceptions per row in tableSpring hibernate - 处理表中每行的异常
【发布时间】:2018-03-07 20:48:32
【问题描述】:

对于我们拥有实体的给定表,我们对数据库中的值的控制有限。当插入包含无效数据的单行时,查询期间最终会引发异常。此异常可防止所有行被反序列化。有没有办法以不影响所有行的方式处理此类异常?

【问题讨论】:

  • 插入了什么样的无效数据导致Hibernate无法创建对应实体?你能举个例子吗?
  • @Dherik 其中一个字段通过属性转换器转换为枚举。枚举中接受字符串并生成枚举的方法是抛出异常的方法

标签: java spring hibernate


【解决方案1】:

恐怕这是不可能的,因为如果可能的话,会有一些附带影响。

例如,如果您尝试使用您的想法进行分页,则计数结果将与返回的实体结果数不同:

// all rows will be count, with problem or not
select count (*) from Person 

// will ignore the problematic rows and bring less results than the count
select p From Person p 

最好的选择似乎更灵活,并为您的代码带来复杂性,在您的实体映射中更加灵活。

例如,如果您的 Enumerator 有问题,因为数据库中的 enumerator 值无效,最好将列映射为 String 而不是 Enumerator 并处理代码中的问题。

所以,如果你有这样的事情:

@Column(name = "status", nullable = false, length = 30)
@Enumerated(EnumType.STRING)
private Status status;

改为:

@Column(name = "status", nullable = false, length = 30)
private String status;

并忽略代码中的结果。有了这种灵活性,您还可以忽略查询中的有问题的结果。喜欢:

SELECT p FROM Person p WHERE status NOT IN (:validStatusAsString)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多