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 问题,您可以在此处找到 - 以防您遇到相同的学习曲线。
我正在使用 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 问题,您可以在此处找到