如何在OneToMany和ManyToMany映射中强制关系集合的最小/最大/精确大小

问题描述 投票:1回答:2

我的工作代码具有这样的类:

@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
2个回答
0
投票

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;

从来没有尝试过,我本能地使用商业代码进行检查。


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);
© www.soinside.com 2019 - 2024. All rights reserved.