gpt4 book ai didi

java - 如何隔离实体验证以防止整个批量(持久)事务的事务回滚?

转载 作者:行者123 更新时间:2023-11-30 03:54:16 28 4
gpt4 key购买 nike

我有带有验证注释的实体,例如@NotNull。我不知道如何防止容器管理的事务在批量持久操作中出现 ConstraintViolationException 的情况下回滚,例如:

public void persistAll(List<TheEntity> entities) throws Exception{

for(TheEntity ent : entities){

em.persist(ent);

}

}

将持久化操作包装在 try-catch 中并不能解决问题,因为即使捕获约束异常,事务也会被标记为回滚(其他“已验证”实体都不会被持久化)。我可以隔离每个实体的事务以进行持久化,但我认为这会对性能产生很大影响(对此不确定,我正在使用带有批处理 JDBC 优化的 eclipselink)。

我知道 ContraintValidationException 的行为按照 JPA 规范要求工作(标记回滚),但我不确定我是否理解 eclipselink 批量优化的工作原理(批量操作是否需要在单笔交易?)。

感谢您的关注。

问候。

编辑:Welp,eclipelink 文档指出“批量写入可以通过在单个事务中而不是单独向数据库发送 INSERT、UPDATE 和 DELETE 语句组来提高数据库性能。”,所以是的,它需要在单个事务中完成。

编辑:我还可以从上下文中注入(inject)约束 validator 并禁用 persistence.xml 上的 JPA validator ,这样我就可以在 JPA PrePersist 操作之前验证实体列表。但是,这将影响不需要对其进行批量操作但仍需要验证的其他实体。啊!快到了。

最佳答案

您可以进行手动验证并跳过无效的实体,如下所示:

// in the class inject validator
@Resource
Validator validator;
...

for(TheEntity ent : entities){
if( validator.validate(ent).size() == 0) {
// valid - persist
em.persist(ent);
} else {
// invalid - skip
}
}

关于java - 如何隔离实体验证以防止整个批量(持久)事务的事务回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23645661/

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