有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

问题: 当只需要ID而不获取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(Account实体已经在DB中),但由于@NotNull注释,我得到了异常

在尝试保存对象商店时,是否有方法忽略Account中的注释,或者如何为Account创建不同的验证规则,以便只验证soem其他属性而不是所有属性

public class Shop { 
    private int id;

    private Account owner; // only ID is needed

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


共 (1) 个答案

  1. # 1 楼答案

    您想看看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组,如果在验证时未指定组标记,bean验证将使用该组

    这意味着以下情况成立:

    // 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属性中指定的上述每个属性,您可以列出一个逗号分隔的组列表,这些组将针对每个事件类型进行验证。这允许您在插入、更新和删除期间进行不同的检查

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

    我经常发现,当来自多个字段的值必须作为一个内聚单元进行验证以暗示其有效性时,这种方法非常有用,因为常规的逐字段验证是不够的