Зачем вызывать большинство методов JPA Repositpry через реализацию класса ContraintValidator во время сохранения, вызывая HH000099: сбой утверждения? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть простой пользовательский валидатор уровня поля, который реализует 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;
            }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...