Оба исключения (уникальное ограничение и слишком большое значение для столбца) связаны между собой.Есть несколько процессов, выполняемых в одной транзакции.Эти процессы делают вызовы методов save () или saveOrUpdate (), стекая запросы до тех пор, пока flush () сеанса Hibernate или не завершат транзакцию.
В какой-то момент flush () сеанса вызывается с помощьюданный сценарий:
Объект A и B оба содержат одинаковую ссылку на объект C. Первый процесс пытается вставить объект A, поэтому сначала выполняет вставку C без проблем, позже пытается вставить A, но происходит сбой из-заисключение слишком большого столбца.В этот момент C находится в базе данных (еще не зафиксирован), но сеанс гибернации находится в некогерентном состоянии из-за предыдущего сбоя, и Hibernate не знает о вставляемом C (сбой при сбросе сеанса не вызывает откат, является ответомразработчик).
Затем выполняется второй процесс и пытается вставить B в базу данных.Если предыдущий процесс прошел нормально, Hibernate вставляет только объект B, потому что он знает, что C уже находится в базе данных.Из-за непоследовательного состояния сеанса Hibernate пытается снова сохранить объект C в базе данных, вызывая исключение уникального ограничения.