无法识别导致Oracle异常Spring DATA JPA的记录

时间:2018-11-13 19:32:10

标签: oracle spring-data-jpa

我有一个用@Transactional注释的方法,我们正在使用spring-data-jpa库的SimpleJPARepository类的save(Iterableentities)方法进行批量更新。我有一种情况,该方法正在处理近2万条记录。正如oracle列所期望的那样,似乎很少有实体在数据类型方面的格式不正确。例如:实体的属性名的值为“ 1234”(Oracle DB不接受,因为DB中的数据类型是VARCHAR)。

由于20000条记录的记录很少,因此,save(Iterableentities)方法将引发“ java.sql.SQLSyntaxErrorException:ORA-01722:无效编号”异常,并且不会保存任何20000条记录。有没有一种方法可以识别导致此异常的记录,并排除它们在数据库中进行更新?

我看到有DOMAIN类中的验证之类的几种选项(对我来说这不太可行,因为我有很多Domain类,更改它们将对我的应用程序产生很大影响)。我看到的另一个选择是使用“带有Hibernate的JPA批处理插入”。同样,即使使用这种批量插入方法,我也不确定是否可以获取导致异常的记录的信息。

任何有关此问题的建议都会有很大帮助。

1 个答案:

答案 0 :(得分:0)

您似乎想做的是让数据库验证您的数据。

我一般认为这是个坏主意,但实际上不适用于JPA。

即使您说您不想修复损坏的域模型,也正是您应该这样做:

  • 更改实体,以使使用的类型与数据库中使用的类型匹配。请注意,尝试在"1234"1234列中存储VARCHARVARCHAR2的值不会触发异常ORA-01722: invalid number,因为没有任何尝试转换任何数字,即使是这样,两个值都是数字,或者很容易解析为数字。

  • 添加验证以确保那些不能由类型(例如字符串的长度)表示的约束。

替代方法是如下所示的过程:

  1. 保留一批实体。

  2. 如果成功,则提交。完成。

  3. 如果未成功,则将批次分成较小的批次,然后从1开始重复。

这是丑陋且缓慢的操作,可能有助于查找需要检查的所有约束,但这并不是过滤掉那些对您的数据库不利的记录的好方法。