У меня есть простой пользовательский валидатор уровня поля, который реализует ContraintValidator. Он использует репозиторий JPA для вызова
1. findById () и
2. считать ()
в методе isValid.
Вызов findById () выполнен успешно. Тем не менее, вызов метода count () вызывает ошибку,
"ОШИБКА org.hibernate.AssertionFailure - HHH000099: произошла ошибка подтверждения (это может указывать на ошибку в Hibernate, но, скорее всего, из-за небезопасного использования сеанса): org.hibernate.AssertionFailure: запись нулевого идентификатора (не сбрасывать сеанс после возникновения исключения) org.hibernate.AssertionFailure: null id "
Я попытался переключить репозиторий JPA, просто чтобы проверить, было ли это что-то конкретное для этого репозитория, но поведение одинаково во всех репозиториях.
Я пытался сделать вызовы других методов JPA, таких как findIfExists, findAll, но все они вызывают ту же ошибку.
Проблема в том, что он жалуется на пустой идентификатор, когда ожидается, что он будет пустым, так как это вызов Save.
public class CountValidator implements ConstraintValidator<Counter, String> {
private AreaRepository areaRepository;
public CountValidator(AreaRepository areaRepository) {
this.areaRepository = areaRepository;
}
@Override
public void initialize(Counter constraint) {}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
boolean isValid = false;
try {
// Simple check to see of repository is reachable (TO BE DELETED)
Area area = areaRepository.findById(1L).get();
// Count number of records in Area table.
long count = areaRepository.count();
if (count < 3) {
isValid = true;
}
} catch (Exception e) {
System.out.println(e);
}
return isValid;
}
}
Ожидалось, что на первой итерации переменная count будет 0, но ошибки вызывают триггерный вызов count (). Кроме того, зачем вызывать метод findById, а не вызывать другие методы. В результате вызов вставки (сохранить) просто откатывается.
ОБНОВЛЕНИЕ - Область
@Audited
@Entity
@Counter
public class Area {
private static final long serialVersionUID = 5058628890621461831L;
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 50)
@Column(length = 50, nullable = false)
private String name;
public Area() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}