Envers + MYSQL + List<String> = SQLSyntaxErrorException: 指定的键太长;

Envers + MYSQL + List<String> = SQLSyntaxErrorException: Specified key was too long;

我正在使用 Envers 扩展具有审计支持的现有应用程序。我注释了所有 @Entity 类 并且得到了一堆异常跟踪。查看它们时,似乎它们都与具有以下形式的属性定义有关

protected List<String> testActivities;  

@ElementCollection
protected List<String> getTestActivities() {
    return testActivities;
}

public void setTestActivities(List<String> testActivities) {
    this.testActivities = FXCollections.observableList(testActivities);
}

所有异常都是List<String>属性,getter方法有@ElementCollection注解。

我得到的异常总是(这里是上述 testActivities 属性的异常)

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table TestCase_testActivities_AUD (REV integer not null, TestCase_id bigint not null, testActivities varchar(255) not null, REVTYPE tinyint, primary key (REV, TestCase_id, testActivities)) engine=MyISAM" via JDBC Statement
..
Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes
..

我猜问题是包含 testActivities 的主键?!

testActivities 属性指的是用户必须执行的指令列表,因此减少代码端的字符串长度(如某些 Whosebug 页面上与密钥长度问题相关的建议)可能不是一个选项? !

目前所有表都是用 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 创建的,我可能可以通过使用 utf8 而不是 utf8mb4 来节省内存,但这是一个好的和可靠的解决方案吗?

如何正确解决这个问题?对于以上两点,我持不同意见。

I 运行 MySQL 服务器 8.0.15、MyISAM 和
我正在使用 Spring Boot,它为我提供了 Hibernate Envers 5.3.10

我忘了说我在 class 级别上使用 @Access(AccessType.PROPERTY)。无论如何,我扩展了相关的 getter 方法

@ElementCollection  
@Column(length=175)     // keep in sync with maxDBStringLength
public List<String> getEnvironmentalInterfaces() {
    return environmentalInterfaces;
}

实际上是这样的。但是,为了不丢失信息,我还扩展了所有方法以将元素添加到列表中,像这样

// Must be in sync with @Column(length=175)  definitions
protected static int maxDBStringLength = Constants.maxDBStringLength;

public void addEnvironmentalInterfaces(String environmentalInterface) throws StringTooLongException {
    if(environmentalInterface.length() > maxDBStringLength) {
        throw new StringTooLongException(maxDBStringLength, environmentalInterface.length());
    }
    environmentalInterfaces.add(environmentalInterface);
}

现在所有表都已创建。不幸的是,我现在遇到了 NullPointer 问题,您可以在此处找到 - 以防您遇到相同的学习曲线。