Как обеспечить минимальный / максимальный / точный размер коллекции отношений в сопоставлениях OneToMany и ManyToMany - PullRequest
1 голос
/ 20 марта 2020

У меня есть рабочий код, у которого есть такой класс:

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

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

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

Я знаю, как применить хотя бы 1 с помощью атрибута nullable . Однако меня интересует, возможно ли добавить проверку JPA (не базы данных), ограничение или проверку для обеспечения соблюдения минимального / максимального / точного количества сущностей в отношениях.

Например, максимум 3 адреса и максимум 10 ролей A и мин 2 роли Б.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Я принял ответ от @ antoine.lange, потому что это, по сути, то, что я искал.

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

Я проверил это, и оно работает точно так, как ожидалось для вставок. Однако для обновления Hibernate не вызывает BeanValidationListener на случай, если вы измените только коллекцию. Вы также должны изменить некоторые атрибуты basi c в качестве обходного пути. Я буду следить за этим в 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);
0 голосов
/ 20 марта 2020

Часть спецификации проверки компонентов (JSR-303) представляет собой аннотацию @Size:

Поддерживаемые типы: String, Collection, Map и arrays. Проверьте, находится ли размер аннотированного элемента между минимальным и максимальным (включительно).

Вы можете проверить коллекцию:

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

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

@OneToMany
@Size(max=3)
List<Address> addresses;

Никогда не пытался, инстинктивно я хотел бы проверить это с бизнес-код.

...