gpt4 book ai didi

java - 如何在 Hibernate 中的同一实体上使用不同的验证规则?

转载 作者:行者123 更新时间:2023-12-01 08:52:19 28 4
gpt4 key购买 nike

问题:当只需要 ID 时,如何将对象 Account 保存为嵌套对象而不出现 ConstraintValidator 异常?

问题是因为我已经为类设置了验证规则,但是当我想将 sem 实体保存为嵌套对象时,我得到了一些属性值丢失的异常。因此,当我想要将对象作为一个整体保留时,以及当我只想使用它作为嵌套对象时(当只需要 ID 时),我希望有不同的验证规则。

public class Account {  
private int id;

@NotNull
private String name;

@NotNull
private String lastName;

@NotNull
private String userName;
//getters&setters

如果我将 Account 作为嵌套对象包含在内,我只需要 ID 即可将其用作 FK(帐户实体已在数据库中),但由于 @NotNull 注释,我得到了异常。

在尝试保存对象 Shop 时,是否有办法忽略 Account 中的这些注释,或者如何为 Account 创建不同的验证规则以仅验证某些其他属性而不是全部属性?

public class Shop { 
private int id;

private Account owner; // only ID is needed

你有什么基本的例子吗?我不明白文档中的内容。在在这里发布之前我已经阅读了文档。

最佳答案

您想要查看 Bean 验证组,您可以在其中对特定验证进行分类,以便仅在验证该组时激活它们,否则将忽略它们。

可以引用文档here了解详情。

以文档中的示例为例:

// This is just a stub interface used for tagging validation criteria
public interface DriverChecks {
}

// The model
public class Driver {
@Min(value = 18, message = "You must be 18", groups = DriverChecks.class)
private int age;
// other stuffs
}

组只不过是一个标签,它允许您在运行时根据特定用例启用/禁用验证。通过不在 Bean 验证注释上指定 groups 属性,它默认为 Default 组,如果未在验证时间。

这意味着以下内容成立:

// Age won't be validated since we didn't specify DriverChecks.class
validator.validate( driver );

// Age will be validated here because we specify DriverChecks.class
validator.validate( driver, DriverChecks.class );

当您在服务方法中自行触发验证时,这非常有用,因为您可以根据该方法的用例手动控制适用的组检查。

当涉及到直接与 Hibernate ORM 的事件监听器集成(也可以触发 Bean 验证)时,组规范变得有点困难,因为它们必须根据 hibernate 引发的事件类型来指定。

javax.persistence.validation.group.pre-persist
javax.persistence.validation.group.pre-update
javax.persistence.validation.group.pre-remove

对于您可以在提供给 Hibernate 的 JPA 属性中指定的上述每个属性,您可以列出要针对每个事件类型进行验证的逗号分隔组列表。这允许您在插入、更新和删除期间进行不同的检查。

如果这还不够,您始终可以创建自己的约束 validator 实现和注释以插入 Bean 验证并在类或属性级别指定。

我经常发现这在必须将来自多个字段的值作为一个内聚单元进行验证以暗示其有效性的情况下非常有用,因为正常的逐字段验证是不够的。

关于java - 如何在 Hibernate 中的同一实体上使用不同的验证规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42307619/

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