Значение jsonb-колонки в Liquibase нужно задавать как JSON-объект, а не как строку с экранированными кавычками. Лишние внешние кавычки превращают значение в jsonb строку-скаляр вместо объекта — и ORM, ожидающий объект, падает при чтении.
Симптом
<!-- НЕПРАВИЛЬНО: в jsonb попадёт строковый скаляр "{\"k\":\"v\"}" -->
<column name="data" value='"{\"k\":\"v\"}"'/>
<!-- ПРАВИЛЬНО: в jsonb попадёт объект {"k":"v"} -->
<column name="data" value='{"k":"v"}'/>Сущность с маппингом jsonb → Map<String, String> (в Hibernate — @Type(JsonBinaryType.class)) при чтении «строкового» значения падает:
MismatchedInputException: Cannot construct instance of `java.util.LinkedHashMap`
from String value ('{"k": "v"}')
Сущность перестаёт читаться → ломается всё, что её грузит.
Почему
Строка '"{\"k\":\"v\"}"' после разбора SQL — это "{\"k\":\"v\"}". Postgres видит ведущую кавычку " и парсит значение как jsonb string scalar, а не объект:
| Значение в Liquibase | jsonb_typeof | ->>'k' |
|---|---|---|
'"{\"k\":\"v\"}"' | string | NULL |
'{"k":"v"}' | object | v |
Коварство: приложение, записывающее тот же Map через ORM, сериализует объект — поэтому записи из кода валидны, а ломается только seed/миграция. Расхождение «код пишет объект, миграция — строку» — верный признак этого бага.
Как проверить
SELECT jsonb_typeof('"{\"k\":\"v\"}"'::jsonb); -- string (баг)
SELECT jsonb_typeof('{"k":"v"}'::jsonb); -- object (правильно)Юнит-тестами обычно не покрыто (jsonb едет через миграцию, а не через unit) — проверять прогоном миграции на реальной СУБД.