7.1.4. MySQL 数据库特性

由于许可限制,MySQL JDBC 驱动程序不随 CUBA Studio 一起分发,因此应该执行以下操作:

  • https://dev.mysql.com/downloads/connector/j 下载驱动程序存档文件

  • 解压缩 JAR 文件并将其重命名为 mysql-connector-java.jar

  • 将 JAR 文件复制到 Program Files/Haulmont/CUBA Studio 2018.3/plugins/cuba-studio/lib/ 目录以及已安装的 Tomcat 服务的 lib 子目录

  • 通过在命令行中执行 gradle --stop 停止 Gradle 守护进程,然后再次启动 Studio

对于不使用 UTF-8 字符集的数据库,不能执行框架中带有约束的数据脚本。此时需要修改数据库的 CharsetCollation name 属性,可以通过在项目属性的 Connection params 字段传递以下参数实现:

?useUnicode=true&characterEncoding=UTF-8

MySQL 不支持部分索引(partial indexes),因此为支持软删除的实体实现唯一约束的唯一方法是在索引中使用 DELETE_TS 列。但是还有另一个问题:MySQL 在具有唯一约束的列中允许存在多个 NULL 值。由于标准 DELETE_TS 列可以为 null,因此它不能在唯一索引中使用。建议使用以下变通方案为支持软删除的实体创建唯一约束:

  1. 在数据库表中创建一个 DELETE_TS_NN 列。此列不为空,并被初始化为默认值:

    create table DEMO_CUSTOMER (
        ...
        DELETE_TS_NN datetime(3) not null default '1000-01-01 00:00:00.000',
        ...
    )
  2. 创建一个触发器,当更改 DELETE_TS 值时将更改 DELETE_TS_NN 值:

    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)