gpt4 book ai didi

jpa - 如何从 EclipseLink 捕获约束违规异常?

转载 作者:行者123 更新时间:2023-12-03 23:34:20 25 4
gpt4 key购买 nike

我在我的 Web 应用程序中使用 EclipseLink,我很难优雅地捕获和处理它生成的异常。我从 this thread 看到似乎是类似的问题,但我不知道如何解决或修复它。

我的代码如下所示:

public void persist(Category category) {
try {
utx.begin();
em.persist(category);
utx.commit();
} catch (RollbackException ex) {
// Log something
} catch (HeuristicMixedException ex) {
// Log something
} catch (HeuristicRollbackException ex) {
// Log something
} catch (SecurityException ex) {
// Log something
} catch (IllegalStateException ex) {
// Log something
} catch (NotSupportedException ex) {
// Log something
} catch (SystemException ex) {
// Log something
}
}

坚持()被一个违反唯一性约束的实体调用,我得到了容器捕获和记录的异常激增。
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement
was aborted because it would have caused a duplicate key value in a unique or
primary key constraint or unique index identified by 'SQL110911125638570'
defined on 'CATEGORY'.
Error Code: -1
(etc)

我尝试了以下方法:
    try {
cc.persist(newCategory);
} catch (PersistenceException eee) {
// Never gets here
System.out.println("MaintCategory.doNewCateogry(): caught: " + eee);
} catch (DatabaseException dbe) {
// Never gets here neither
System.out.println("MaintCategory.doNewCateogry(): caught: " + dbe);
}

我意识到使用 DataBaseException 不可移植,但我需要从某个地方开始。异常永远不会被捕获。有什么建议?

最佳答案

看起来我不会再有关于这个问题的事件了,所以我会发布我的解决方法并留在那里。许多网络搜索没有找到任何有用的东西。我会认为这是一个教科书案例,但我找到的教程都没有涵盖它。

事实证明,在 EclipseLink 的这种情况下,违反 SQL 约束时可以捕获的异常是 回滚异常 这是 的结果em.commit() 称呼。所以我修改了我的persist方法,如下所示:

public void persist(Category category) throws EntityExistsException {
try {
utx.begin();
em.persist(category);
utx.commit();
} catch (RollbackException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
throw new EntityExistsException(ex);
} catch (HeuristicMixedException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (HeuristicRollbackException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalStateException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (NotSupportedException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
} catch (SystemException ex) {
Logger.getLogger(CategoryControl.class.getName()).log(Level.SEVERE, null, ex);
}
}

所以调用者捕获了 EntityExistsException 并采取适当的行动。日志仍然充满内部异常,但可以稍后关闭。

我意识到这有点滥用 的意图。 EntityExistsException 这通常仅在重用实体 ID 字段时使用,但对于用户应用程序而言,这无关紧要。

如果有人有更好的方法,请发布新的答案或评论。

关于jpa - 如何从 EclipseLink 捕获约束违规异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com