7.4. Особенности MySQL

JDBC-драйвер MySQL не распространяется в составе CUBA Studio в связи с его лицензией. Поэтому следует загрузить архив с драйвером со страницы https://dev.mysql.com/downloads/connector/j, извлечь JAR-файл, переименовать его в mysql-connector-java-5.1.38.jar и положить в подкаталог lib Studio и подкаталог lib установленного сервера Tomcat. После этого необходимо остановить Studio, остановить демона Gradle, выполнив в командной строке gradle --stop, а затем снова запустить Studio.

MySQL не поддерживает частичные (partial) индексы, поэтому единственная возможность создать ограничение уникальности для soft deleted сущности - это использовать в составе индекса колонку DELETE_TS. Однако, существует другая проблема: MySQL позволяет иметь несколько NULLs в колонке с ограничением уникальности. Так как стандартная колонка DELETE_TS является nullable, она не может быть использована в уникальном индексе. Рекомендуется следующий способ создания уникальных ограничений для сущностей с мягким удалением:

  1. Создайте в таблице колонку DELETE_TS_NN с параметром not null и значением по умолчанию:

    create table DEMO_CUSTOMER (
        ...
        DELETE_TS_NN datetime(3) not null default '1000-01-01 00:00:00.000',
        ...
    )
  2. Создайте триггер, изменяющий DELETE_TS_NN когда меняется DELETE_TS:

    create trigger DEMO_CUSTOMER_DELETE_TS_NN_TRIGGER before update on DEMO_CUSTOMER
    for each row
        if not(NEW.DELETE_TS <=> OLD.DELETE_TS) then
            set NEW.DELETE_TS_NN = if (NEW.DELETE_TS is null, '1000-01-01 00:00:00.000', NEW.DELETE_TS);
        end if
  3. Создайте уникальный индекс, включающий в себя уникальные колонки и DELETE_TS_NN:

    create unique index IDX_DEMO_CUSTOMER_UNIQ_NAME on DEMO_CUSTOMER (NAME, DELETE_TS_NN)