Sha*_*ane 1 java jpa java-ee ejb-3.0
我正在开发一个在glassfish v3上运行的EJB应用程序.如果我查看EntityManager类的javadoc,它会说像find,persist等方法抛出从PersistenceException派生的异常.但是,在实践中我注意到,如果在数据库级别出现问题(例如,找不到表),则可能抛出从org.eclipse.persistence.exceptions.DatabaseException派生的异常.所以我正确地假设除了标准的持久性异常之外,我还必须处理由我使用的任何持久性提供程序引发的异常?这往往意味着我需要编写特定于我选择的JPA提供程序的错误代码,如果我稍后更改为另一个,我需要更改我的代码以捕获不同的异常类,如HibernateException.
在我看来,你应该只处理来自标准JPA异常层次结构的异常(除非你想处理规范没有标准异常的特定情况,在这种情况下你的应用程序将不可移植 - 但我可以我想不出任何问题.EJB 3.0 JPA规范(JSR 220)在3.7节中对它们进行了总结:
3.7例外摘要
以下是本规范定义的异常的摘要:
PersistenceException在
PersistenceException发生问题时的持久性提供抛出.可能会抛出报告由于意外错误(例如,持久性提供程序无法打开数据库连接)而无法完成调用的操作.
本规范定义的所有其他异常都是PersistenceException.的所有实例PersistenceException除的情况下NoResultException,并NonUniqueResultException会导致当前事务,如果一个人是活动的,将被标记为回滚.
TransactionRequiredException当需要事务但未激活时,持久性提供程序抛出TransactionRequiredException.
OptimisticLockException
OptimisticLockException发生乐观锁定冲突时,持久性提供程序抛出此异常.此异常可能作为API调用的一部分,在刷新或提交时抛出.当前事务(如果一个处于活动状态)将被标记为回滚.
RollbackException在
RollbackException当通过持久性提供抛出EntityTransaction.commit失败.
EntityExistsException
EntityExistsException当调用perist操作并且实体已存在时,持久性提供程序可能抛出该异常提供程序.该EntityExistsException被调用persist操作时可能抛出,或EntityExistsException或另一个PersistenceException可在提交时被抛出.
EntityNotFoundException的
EntityNotFoundException是由持久性提供抛出当由获得的实体引用getReference被访问,但是该实体不存在.当数据库中不再存在实体时,刷新操作也会抛出它.当前事务(如果一个处于活动状态)将被标记为回滚.
NoResultException该
NoResultException是由持久性提供抛出时Query.getSingleResult被调用,并且没有结果返回.此异常不会导致当前事务(如果处于活动状态)标记为回滚.
NonUniqueResultException在
NonUniqueResultException当由持久性提供抛出Query.getSingleResult被调用并没有从查询多个结果.此异常不会导致当前事务(如果处于活动状态)标记为回滚.
对我来说,特定于提供者的异常是"内部"的东西,大部分时间用于表示技术问题,即应用程序中应该修复的错误(例如,如果缺少表,这是一个错误,修复它,它没有意义处理这种例外).
| 归档时间: |
|
| 查看次数: |
6817 次 |
| 最近记录: |