gpt4 book ai didi

java - 在 Hibernate 中优雅地处理 ConstraintValidationExceptions

转载 作者:行者123 更新时间:2023-11-29 01:31:21 26 4
gpt4 key购买 nike

S.O. 上有很多帖子。与执行 Hibernate 验证、捕获异常等相关的其他站点。然而,在下面描述的情况下,所有这些都让我反对一些非常不理想的设计选择。这似乎是一种常见的情况,我不敢相信没有一个干净的解决方案。

  • 我想利用 Javax(和 Hibernate)的验证注释,
  • 我想更正或丢弃无效对象,
  • 我想利用 javax 的 PrePersist 等注释来处理对我的对象的重复或基于时间的操作。

同时使用这三个似乎不起作用。

一个人是做什么的?

具体来说,我有很多(10,000 多个)对象,其中一小部分总是无效的。

@Entity
public class myPojo implements Serializable {

@Id
@GeneratedValue
private long id;

@NotBlank
private String anotherString;

@NotNull
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;

@NotNull
@Temporal(TemporalType.TIMESTAMP)
private Date updatedAt;

@NotNull
@Temporal(TemporalType.TIMESTAMP)
private Date postedDate;

@PrePersist
protected void onPrePersist() {
this.createdAt = new Date();
this.updatedAt = this.createdAt;
if (this.postedDate == null)
this.postedDate = this.createdAt;
}
}

我想保存这个函数,并捕获任何违反约束的对象:

void saveResource(MyPojo myPojp) {
try {
session.saveOrUpdate(mypojo);
}
catch (final ConstraintViolationException ex) {
System.err.println("Could not save " + myPojo + " because " +
this.getValidationErrors(myPojo));
}
}

其中 getValidationErrors() 返回通过手动创建和使用验证工厂找到的所有 ConstraintViolation 的字符串。

我所知道的唯一其他可能性是围绕每次保存执行单个事务(这似乎是个坏主意,因为如果确实发生了真正的异常,我不希望任何项目持续存在)或者可能编写一个自定义 validator 来在调用 prepersist Hook 的保存之前手动运行(可维护性噩梦!)。

[1]:我知道那是一个糟糕的引用资料,但我已经读了很多书,我再也找不到了。很高兴有人能在更多技术细节中澄清哪些错误导致交易无效,哪些错误可以恢复。

最佳答案

想法 1:为什么要将应用程序级别的验证注释放在您在 PrePersist 中自行管理的字段上,而不是由用户设置?

想法 2:您可以使用验证组,这样您就可以只预先检查那些在用户级别设置的字段,而忽略系统管理的字段。

关于java - 在 Hibernate 中优雅地处理 ConstraintValidationExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11403855/

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