gpt4 book ai didi

java - 从 MySql 切换到内存数据库进行测试时,解决这些 Hibernate 异常的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-29 11:33:13 28 4
gpt4 key购买 nike

我正在开发一个使用 MySql 作为数据源的 Spring Boot 应用程序。应用程序中有一个实体,其字段的定义如下:

@Column(name = "Vendor", columnDefinition="TEXT")
private String vendor;

数据库中列的定义是varchar(255),这就是为什么我怀疑该实体已被赋予columnDefintion'TEXT',因为没有它我会得到异常:

Caused by: org.hibernate.HibernateException: Wrong column type in database.example for column Vendor. Found: text, expected: varchar(255)

当我运行应用程序并且它与 MySql 数据库通信时,这很好。当我想运行一些与配置如下的内存数据库(本例中为 hsqldb)对话的测试时,问题就出现了:

@Bean
public DataSource meshlium()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:mem:meshlium");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}

/**
* Declare the JPA entity manager factory.
*/
@Primary
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
{
LocalContainerEntityManagerFactoryBean entityManagerFactoryOffice = new LocalContainerEntityManagerFactoryBean();

entityManagerFactoryOffice.setDataSource(meshlium());

// Classpath scanning of @Component, @Service, etc annotated class
entityManagerFactoryOffice
.setPackagesToScan("com.mottmac.meshlium.scan");

// Vendor adapter
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactoryOffice.setJpaVendorAdapter(vendorAdapter);

// Hibernate properties
Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.show_sql",
true);
additionalProperties.put("hibernate.hbm2ddl.auto", "create-drop");
additionalProperties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
entityManagerFactoryOffice.setJpaProperties(additionalProperties);

return entityManagerFactoryOffice;
}

当我运行测试并且 hibernate 尝试创建数据库时,我在日志文件中收到异常:

2016-05-05 15:44:31.020(GMT)[main] ERROR o.h.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table bluetoothData (ID_frame integer not null, RSSI varchar(255), MAC varchar(255), TimeStamp timestamp, Vendor TEXT, ID TEXT, cod varchar(255), primary key (ID_frame))
2016-05-05 15:44:31.020(GMT)[main] ERROR o.h.tool.hbm2ddl.SchemaExport - Wrong data type: TEXT in statement [create table bluetoothData (ID_frame integer not null, RSSI varchar(255), MAC varchar(255), TimeStamp timestamp, Vendor TEXT]

如果我从 vendor 中删除 columnDefinition 属性,问题就会消失,我的测试可以运行,但是正如我上面所述,应用程序将无法启动。因此,我陷入了这样一种情况:我可以更改代码以使应用程序正常工作,但测试失败,或者测试失败但应用程序正常工作。

我在其他地方看到提到的一个解决方案是更改 @Column 注释以使用 length 属性并删除 columnDefintion 以便我有:

@Column(name = "Vendor", length=255)
private String vendor;

此更改允许我的测试通过,但在启动时仍然抛出原始异常。

是否有一种解决方案可以让我的测试和应用程序在生产中使用 MySql 并在单元测试中使用 hsqldb 时正常运行?

最佳答案

因此,一点研究表明您可以将 H2 设置为以 MYSQL 模式运行。

我相信,如果您将数据库 URL 更改为末尾有 MODE=MySQL ,它应该可以工作!

编辑:如果您想坚持使用 HSQL,它们也有一个等效的属性 - sql.syntax_mys=true

关于java - 从 MySql 切换到内存数据库进行测试时,解决这些 Hibernate 异常的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055022/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com