Как установить имя уровня проверки jpa уровня ограничения - PullRequest
1 голос
/ 18 июня 2019

Я хотел бы определить ограничение в JPA для объекта, чтобы убедиться, что для одного из двух свойств "текст" или "заголовок" задано ненулевое значение.

Для этого примера предположим, что следующий класс сущностей Вопрос:

@Entity
@Table
public class Question {

@Id
private Long id;

@Column(nullable = true)
private String text;

@Column(nullable = true)
private String title;

}

Для этого класса JPA сгенерирует следующую инструкцию SQL (нам нужно использовать диалект оракула):

    create table question (
        id number(19,0) not null,
        text varchar2(50 char) null,
        title varchar2(10,0) null,
        primary key (id)
    );


Чтобы проверить, установлено ли одно из свойств, я мог бы добавить проверочное ограничение:

@Entity
@Table
@Check(constraints = "TEXT IS NOT NULL OR TITLE IS NOT NULL")    
public class Question {
...
}

Теперь JPA сгенерирует это:

    create table question (
        id number(19,0) not null,
        text varchar2(50 char) null,
        title varchar2(10,0) null,
        primary key (id),
        check (TEXT IS NOT NULL OR TITLE IS NOT NULL)
    );

На стороне базы данных это сгенерирует проверочное ограничение со случайным именем, например «SYS_C00127157».

Чтобы присвоить значимое имя (например: check_title ) ограничению, я мог бы использовать этот DDL:

    create table question (
        id number(19,0) not null,
        text varchar2(50 char) null,
        title varchar2(10,0) null,
        primary key (id),
        constraint check_title check(TEXT IS NOT NULL OR TITLE IS NOT NULL)
    );

Что я ищу, так этокак то так:

@Entity
@Table
@Check(name = "check_title" constraints = "TEXT IS NOT NULL OR TITLE IS NOT NULL")    
public class Question {
...
}

К сожалению, это невозможно.Аннотация @Check в Java не предлагает такого свойства name для ограничения.

Есть ли другой способ задать имя, чтобы сгенерированный DDL соответствовал ожидаемому результату?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

К сожалению, это невозможно. Если вы посмотрите, как построен скрипт генерации таблицы:

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/mapping/Table.java#L604

вы увидите, что строка, указанная вами в аннотации @Check, просто обернута так:

buf.append( ", check (" )
    .append( checkConstraint )
    .append( ')' );

и генерация имени ограничения передается в базу данных.

Напротив, на несколько строк выше вы можете обнаружить, что можно влиять на имя уникальных ограничений. Здесь вы можете найти пример этого.

0 голосов
/ 18 июня 2019

Это невозможно.

По моему мнению, также не очень хорошая идея генерировать производственную базу данных из аннотаций JPA.Модель данных обычно длится дольше, чем приложение, и поэтому хорошо иметь контроль над DDL.

Вам следует рассмотреть возможность использования FlyWay или Liquibase для миграции базы данных.

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