@galliard

Как в JPA установить констрейнт, чтоб одно из трех полей было не null, а остальные null?

В общем есть 3 поля, все в сущность описаны как nullable enum, в дб как nullable varchar. При этом по логике должно быть заполнено либо первое, либо второе, либо третье (но не несколько сразу). Какое из них должно быть заполнено - зависит от значения четвертого поля.

Для начала я в миграцию руками дописал sql
CONSTRAINT method_check CHECK (
        (column1 IS NOT NULL AND column2 IS NULL AND column3 IS NULL)
            OR
        (column1 IS NULL AND column2 IS NOT NULL AND column3 IS NULL)
            OR
        (column1 IS NULL AND column2 IS NULL AND column3 IS NOT NULL)
    )

И это сработало. Но получилось, что информация о структуре базы не отражена в коле, только в минрациях. Я бы хотел сделать то же самое с помощью аннотаций, но лучшее, что мне удалось нагуглить - это аннотация Check
@Check(
    name = "method_check",
    constraints = "(column1 IS NOT NULL AND column2 IS NULL AND column3 IS NULL)\n" +
            "            OR\n" +
            "        (column1 IS NULL AND column2 IS NOT NULL AND column3 IS NULL)\n" +
            "            OR\n" +
            "        (column1 IS NULL AND column2 IS NULL AND column3 IS NOT NULL)"
)

Выглядит не красиво, но это хрен с ним. Проблема в том, что это не работает, JPA explorer просто игнорирует эту аннотацию и не добавляет этот код в миграцию.

Есть ли еще какие-нибудь (рабочие) способы установки данного констрейнта?
  • Вопрос задан
  • 32 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы