У меня есть отношения ManyToMany между пользователем и ролью.У меня есть пользовательское ограничение проверки гибернации для моих ролей, заданных в разделе «Пользователь».
В @PostConstruct
я сохраняю начальные роли (ADMIN, USER) в базе данных, используя стандартный JpaRepository из spring-data-jpa.Затем я создаю первоначального пользователя с помощью роли администратора.
Если у меня нет своей пользовательской проверки, связь сохраняется правильно, и я вижу запись в user_role
таблице присоединения.Если у меня есть проверка, пользователь вставляется в пользовательскую таблицу , но без записи в таблицу user_role
. Возвращенный объект имеет роль в наборе ролей, но не сохраняется в БД,Код обобщен ниже.Я не могу понять, как использование RoleRepo для получения всех ролей может каким-либо образом нарушить сохранение, но это так.
class User {
@Id
String username;
@ValidOption
@ManyToMany(cascade = {CascadeType.ALL //for example}, fetch=FetchType.EAGER)
Set<Role> roles;
}
class Role {
@Id
String name;
}
class CustomValidator implements ConstraintValidator<ValidOption, Object> {
RoleRepository roleRepo; //injected by spring... have spring factory
@Override
public boolean isValid(Object value, ConstraintValidatorContext context){
roleRepo.findAll() //<-------------- THIS CALL BREAKS THE SAVE
return true;
}
}
@Component
class UserCreator {
RoleRepository roleRepo;
UserRepo userRepo;
@PostConstruct
void setup(){
Role admin = roleRepo.saveAndFlush(new Role('ADMIN'));
roleRepo.saveAndFlush(new Role('USER'));
User user = new User('admin', Collections.singleton(admin));
userRepo.save(user); //<------ DOES NOT INSERT ADMIN INTO USER_ROLE JOIN TABLE
}
}
Это работает на 100% точно так, как я ожидал, если бы я удалил пользовательский валидатор,Это также может работать, если я не запустил это в PostConstruct и не запланировал его в другом потоке, мне нужно проверить это.
Проект с воспроизводимым неудачным тестовым примером: https://github.com/tjhelmuth/SPR-22533/blob/master/src/test/java/spr22533/bug/BugExample.java