gpt4 book ai didi

persistence - 在 JBoss AS 7 中捕获 PersistenceException 或 ConstraintViolationException

转载 作者:行者123 更新时间:2023-12-04 22:35:07 24 4
gpt4 key购买 nike

我正在从 JBoss AS 6 迁移到 JBoss AS 7,并且在我的测试中遇到了问题。让我们假设一个简单的实体 EJB:

@Entity public class MyTest implements Serializable
{
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private long id;

@NotNull
private String headline;
} //getter/setter

在我的 @Stateless Bean 中,我正在做这样的事情(就像以前使用 JBoss5 和 JBoss6):
@Inject private EntityManager em;

public <T extends Object> T persist(T o) throws MyContraintViolationException
{
System.out.println("***************** persist:");
try
{
em.persist(o);
}
catch (Exception e)
{
System.out.println("*************** exception:");
// Further investigation of Exception e,
// then throw MyContraintViolationException
}
}

如果我不违反 @NotNull 约束,这很好用。如果 headline==null ,我会收到异常,但不要输入我的 catch 块:
12:19:45 INFO  ******************** persist:
12:19:45 WARN [com.arjuna.ats.arjuna] (management-handler-threads - 2)
ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for
SynchronizationImple< 0:ffffc0a801fb:4f969a6e:4f058744:9,
org.hibernate.engine.transaction.synchronization.internal.
RegisteredSynchronization@38eb9b73 >: javax.persistence.PersistenceException:
error during managed flush
...
Caused by: javax.validation.ConstraintViolationException: Validation failed for
classes [my.test.MyTest] during persist time for groups
[javax.validation.groups.Default, ] List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='kann nicht null sein',
propertyPath=headline, rootBeanClass=class my.test.MyTest,
messageTemplate='{javax.validation.constraints.NotNull.message}'}

我很高兴看到错误消息比以前版本的 JBoss 详细得多,但是我如何捕获 javax.validation.ConstraintViolationException 并抛出我自己的 MyContraintViolationException ?甚至不打印调试消息 ***** exception

最佳答案

如果您阅读消息和异常的堆栈跟踪,您将看到此异常不是由持久化调用引发的,而是由刷新引发的:

error during managed flush



persist 不发出任何查询,也不向数据库保存任何内容。它只是要求实体管理器使临时实体持久化。在刷新时间(即在事务提交之前,或在 Hibernate 执行查询之前,可能需要此实体在数据库中以返回正确结果,或当 flush() 被显式调用时),然后检查约束并插入查询被执行。

您可能会显式调用flush,但它不会让Hibernate 批处理多个查询并仅在必要时执行它们,这会影响应用程序的性能。我只会使用 native 异常。为什么需要这样的转换?

关于persistence - 在 JBoss AS 7 中捕获 PersistenceException 或 ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8742000/

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