- Shipped
- 20 апреля 2026 г. в 20:59 UTC
- Author
- Kamo
- Commit
- ea4a85b
Hibernate @Enumerated (EnumType.ORDINAL) пишет/читает индекс декларации Энум. При удалении значения RoleRightType (например, MANAGE USERS, id=19) Каждый последующий вход смещается на один, в то время как getId() остается на месте - Создание молчаливого расхождения. В этой кодовой базе сырой SQL upsert **************** всегда пишет getId(), поэтому после MANAGE USERS была удалена + добавлены новые права, DB теперь имеет значения right type (например, 136), которые превышают значения (длины) RoleRightType, в результате чего Hibernate Бросьте ArrayIndexOutOfBoundsException на чтение и аварийный запуск. Представляем RoleRightTypeIdConverter **************************** Целое число> Путешествие через GetId(). Применяется ко всем пяти таблицам с правильной картой: OrgRoleRight - Член право JobTitleRight - Отдел права Применяемые права Неизвестные идентификаторы преобразуются обратно в нуль, поэтому **************** Они могут убираться на следующем ботинке, а не ломаться. Данные колонки уже соответствует getId() (это то, что вставляет IfAbsent), поэтому никакой миграции Это необходимо — конвертер выравнивает Hibernate с тем, что фактически хранится.