0

我正在使用 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 属性是指用户必须执行的指令列表,因此减少代码端的字符串长度,正如一些与密钥长度问题相关的 StackOverflow 页面所建议的那样,可能不是一个选项?!

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

如何以正确的方式解决这个问题?我对以上两点持不同看法。

我运行 MySQL Server 8.0.15、MyISAM,
我使用的是 Spring Boot,它为我提供了 Hibernate Envers 5.3.10

4

1 回答 1

0

我忘了提到我@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 问题,您可以在此处找到创建测试数据时的 Envers NullPointerException - 以防万一您正在经历相同的学习曲线。

于 2019-08-29T16:28:10.993 回答