Hibernate 如何在一对多映射中强制实施关系集合的最小/最大/精确大小

Hibernate 如何在一对多映射中强制实施关系集合的最小/最大/精确大小,hibernate,jpa,spring-data-jpa,hibernate-mapping,Hibernate,Jpa,Spring Data Jpa,Hibernate Mapping,我有这样一个类的工作代码: @Entity class User { @ManyToMany @JoinTable(...) List<RoleA> aRoles; @ManyToMany @JoinTable(...) List<RoleB> bRoles; @OneToMany @JoinTable(...) List<Address> addresses; } @实体 类用户{ @许多 @可接合(…) 罗列阿罗莱

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

@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。

Bean验证规范(JSR-303)的一部分是@Size注释:

支持的类型有字符串、集合、映射和数组。检查注释的图元大小是否介于最小值和最大值(包括最小值和最大值)之间

您可以验证集合:

@ManyToMany
@Size(max=10)
List<RoleA> aRoles;

@ManyToMany
@Size(min=2)
List<RoleB> bRoles;

@OneToMany
@Size(max=3)
List<Address> addresses;
@manytomy
@尺寸(最大值=10)
罗列阿罗莱斯;
@许多
@尺寸(最小值=2)
罗尔斯;
@独身癖
@尺寸(最大值=3)
列出地址;
从未尝试过这种方法,本能地我会用商业代码检查它。

我接受了@antoine.lange,因为它本质上就是我所寻找的

class User {
  @ManyToMany
  @Size(min=1, max=1)
  List<RoleA> aRoles;
}
这个函数执行(并抛出ConstraintViolationException):


我正在用业务代码检查这一点,但是我更喜欢JPA映射和我的DB(在本例中我不控制它)防弹。我会试试你的建议。
existingUser.getARoles().add(role1);
existingUser.getARoles().add(role2);
userRepository.saveAndFlush(existingUser);
user.setName(newName);
existingUser.getARoles().add(role1);
existingUser.getARoles().add(role2);
userRepository.saveAndFlush(existingUser);