我的工作代码具有这样的类:
@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;
从来没有尝试过,我本能地使用商业代码进行检查。
我从@ 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);