2014-04-27 64 views
13

我有这个Spring Data CrudRepository,它处理DB上的CRUD操作。Spring CrudRepository异常

@Repository 
public interface IUserRepository extends CrudRepository<User, String> { 

} 

User是我的数据库的用户表的实体。 CrudRepository增加即下面的操作到仓库:

  • delete(String ID)
  • findOne(String ID)
  • save(User user)

正如documentation所述,删除和查找操作的情况下抛出IllegalArgumentException给定的ID是null,而保存操作不会抛出任何异常。

问题是CrudRepository的javadoc没有提及这些操作抛出的其他异常。例如,它并不告诉delete(String ID)操作会在数据库中不存在所提供的ID的情况下抛出EmptyResultDataAccessException

save(User user)操作的javadoc中,如果插入一个破坏一个数据完整性约束(在唯一字段和外键上)的新用户,则不清楚抛出了哪些异常。此外,它不会警告您是否正在编写新的或存在的用户:它只是创建一个新用户或覆盖如果存在(因此它是一个Insert + Update操作)。

在企业应用程序中,我应该能够捕获每个可引发的异常,一个操作可以抛出,我应该在操作的javadoc中阅读。

你知道任何关于CrudRepository异常的明确文档吗?

谢谢

回答

22

春天已经内置例外转换机制,使由JPA持久性提供抛出的所有异常转换成Spring的DataAccessException - 与@Repository(或配置)注释:所有的bean。

有四个主要的群体 -

  • NonTransientDataAccessException - 这些都是在那里,除非异常的原因被纠正的同重试操作将失败的异常。因此,例如,如果您传递了非现有的ID,则它将失败,除非ID存在于数据库中。

  • RecoverableDataAccessException - 这些与前一个“相反” - 可恢复的异常 - 在一些恢复步骤之后。 API文档中的更多详细信息

  • ScriptException - 尝试处理格式不正确的脚本时与SQL相关的异常。

  • TransientDataAccessException - 当没有任何明确的步骤可以恢复时,这些例外是例外的。当数据库发生超时时,您将在几秒钟后重试。

这就是说,要找到所有异常的文档的理想场所 - 是API本身 - 刚刚经历的DataAccessException层次。

+0

感谢您提供所有例外的链接,并详细解释它们的含义。 –

+1

@vtor你是什么意思的“内置的异常翻译机制”。我很好奇为什么春季文档没有明确说明某些方法抛出这个DataAccessException,例如保存CrudRepository类的方法。 – fabrik