【问题标题】:How to enforce min/max/exact size of relationship collection in OneToMany and ManyToMany mappings如何在 OneToMany 和 ManyToMany 映射中强制关系集合的最小/最大/精确大小
【发布时间】:2020-07-01 03:43:06
【问题描述】:

我有这样一个类的工作代码:

@Entity
class User {
  @ManyToMany
  @JoinTable(...)
  List<RoleA> aRoles;

  @ManyToMany
  @JoinTable(...)
  List<RoleB> bRoles;

  @OneToMany
  @JoinTable(...)
  List<Address> addresses;
}

我知道如何通过 nullable 属性强制执行至少 1 个。 但是,我感兴趣的是是否可以添加 JPA(不是数据库)检查、约束或验证来强制关系中实体的最小/最大/确切数量。

例如最多 3 个地址和最多 10 个角色 A 和最少 2 个角色 B。

【问题讨论】:

    标签: hibernate jpa spring-data-jpa hibernate-mapping


    【解决方案1】:

    我接受了来自@antoine.lange 的answer,因为它本质上就是我想要的。

    class User {
      @ManyToMany
      @Size(min=1, max=1)
      List<RoleA> aRoles;
    }
    

    我已经对此进行了测试,它的工作原理与插入的预期完全一样。但是,如果您只更改集合,Hibernate 不会调用 BeanValidationListener 进行更新。作为一种解决方法,您也必须更改一些基本属性。我将在 Hibernate Jira 上跟进:HHH-13898

    此序列不会触发验证:

    existingUser.getARoles().add(role1);
    existingUser.getARoles().add(role2);
    userRepository.saveAndFlush(existingUser);
    

    这个会(并抛出 ConstraintViolationException):

    user.setName(newName);
    existingUser.getARoles().add(role1);
    existingUser.getARoles().add(role2);
    userRepository.saveAndFlush(existingUser);
    

    【讨论】:

      【解决方案2】:

      Bean Validation Specification (JSR-303) 的一部分是@Size 注解:

      支持的类型有 String、Collection、Map 和数组。检查带注释的元素大小是否介于 min 和 max(含)之间。

      您可以验证集合:

      @ManyToMany
      @Size(max=10)
      List<RoleA> aRoles;
      
      @ManyToMany
      @Size(min=2)
      List<RoleB> bRoles;
      
      @OneToMany
      @Size(max=3)
      List<Address> addresses;
      

      从未尝试过,本能地我会用业务代码检查这个。

      【讨论】:

      • 我正在使用业务代码检查这一点,但是我更喜欢 JPA 映射和我的数据库(在这种情况下我无法控制)防弹。我会试试你的建议。
      猜你喜欢
      • 2018-03-06
      • 2011-12-15
      • 2011-03-09
      • 2017-05-12
      • 2017-09-09
      • 2023-03-03
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多