当前位置: 首页 > 知识库问答 >
问题:

在启动时执行 DDL 验证时不使用@TableHibernate。使用飞行通道和测试容器

华升
2023-03-14

我对Hibernate有问题。我正在通过Flyway迁移创建表。下面显示了初始迁移脚本的一部分片段。该脚本确实运行(我可以在DEBUG模式下看到它)。

脚本运行后,Hibernate的验证器似乎没有使用我通过< code>javax.persistence提供的实体的表名。

为了清楚起见,这里有一些省略的实体:


import javax.persistence.*;


@Entity
@Table(name = "IngredientCategories")
public class IngredientCategory implements IEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false, length = 128)
    private String name;

    ...
}
CREATE TABLE `IngredientCategories` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `description` varchar(255) DEFAULT NULL,
  `name` varchar(128) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

查看日志,Flyway迁移正在运行,然后我收到Hibernate验证错误。

2020-10-24 11:22:11.952 DEBUG 91583 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully completed migration of schema `test` to version 1 - init
2020-10-24 11:22:11.961 DEBUG 91583 --- [           main] o.f.c.i.s.JdbcTableSchemaHistory         : Schema History table `test`.`flyway_schema_history` successfully updated to reflect changes
2020-10-24 11:22:11.970  INFO 91583 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 1 migration to schema `test` (execution time 00:00.107s)
2020-10-24 11:22:11.972 DEBUG 91583 --- [           main] org.flywaydb.core.Flyway                 : Memory usage: 82 of 354M
2020-10-24 11:22:12.088  INFO 91583 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-10-24 11:22:12.125  INFO 91583 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.20.Final
2020-10-24 11:22:12.237  INFO 91583 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-10-24 11:22:12.350  INFO 91583 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
2020-10-24 11:22:12.998  WARN 91583 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [ingredient_categories]
2020-10-24 11:22:12.998  INFO 91583 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-10-24 11:22:13.420  INFO 91583 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2020-10-24 11:22:13.428  INFO 91583 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-10-24 11:22:13.434 ERROR 91583 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [ingredient_categories]

我无法确定这是一个Hibernate问题、一个飞行路线问题还是一个测试问题。

这只是测试“启动”应用程序:

@SpringBootTest
@Testcontainers
class DataApplicationTests {

    @Test
    void contextLoads() {
    }

}

我环顾了一下,可以看到很多人在Spring 2x之前就遇到了一个问题,在flyway生成模式之前验证了表……但这似乎已经“修复”了,默认情况是flyway迁移在之前运行。

我认为问题显示Hibernate的行期望一个表名模式验证:缺少表[ingredient_categories],所以它似乎没有使用javax.constaint.Table @Table(名称=“成分类别”)注释来运行和构建上下文/豆。

应用程序属性并不太令人兴奋...我正在使用测试容器:

#=========INTEGRATION TESTS========#

## Using TestContainers
spring.datasource.url=jdbc:tc:mysql:8.0.22:///

# Validate Schema
spring.jpa.hibernate.ddl-auto = validate

logging.level.org.flywaydb=DEBUG

共有1个答案

汤兴生
2023-03-14

来自官方文件

默认情况下,Spring启动使用“Spring物理命名策略”配置物理命名策略。此实现提供与 Hibernate 4 相同的表结构:所有点都替换为下划线,骆驼大小写也替换为下划线。默认情况下,所有表名都以小写形式生成,但如果架构需要该标志,则可以覆盖该标志。

例如,TelephoneNumber实体映射到telephone_number表。

因此< code > ingredient categories 变成了< code > ingredient _ categories 。对于数据库表名,一般约定使用snake-case。您可以在snake case中创建带有名称的表

CREATE TABLE `ingredient_categories`

或者,如果您更喜欢使用Hibernate 5的默认值,请设置以下属性:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

然后您的表的名称仍然是Ingredient类别,如@Table注释中所示。有关Hibernate 5命名策略配置的详细信息

 类似资料:
  • 我有一个python脚本,它计算给定文件的字数,并在执行后将输出保存到“result.txt”文件中。我希望docker容器在容器启动时执行此操作,并在控制台上显示输出。下面是我的docker文件和python文件 我正在映射一个本地目录,它有两个文本文件IF. txt和Limerick1.txt从主机到容器内的目录/home/data,容器内的python代码读取文件并将输出保存到result.

  • ErrorOccuredDuringInitializationofbootlayer我在运行测试时不断得到这个错误: 初始化启动层Java.lang.module.findException时出错:无法为C:\users\bonfire.eclipse\org.eclipse.platform_4.12.0_867647348_win32_win32_x86_64\plugins\com.beu

  • 有没有办法在类上不使用@RunWith(MockitoJUnitRunner)注释来模拟存储库? 我有一个测试通过了,没有注释,但是失败了。没有它,我的回购测试就不起作用。这是第二十二条军规。 当我使用这个注释时,我的测试中的当()方法不再是存根行为,模拟什么也不做,尽管设置了断点,那些断点被击中(表明行/方法正在运行),验证(...,次(x))语句说模拟对象从未与该方法相互作用。我一直在想为什么

  • 我已经使用selenium创建了测试用例,之前我可以使用maven(从命令行和eclipse)执行我的测试用例。但是现在它不起作用了。请帮助 请在下面找到控制台日志:(运行为- 我没有得到任何错误,它成功地构建了一个项目。但是跳过所有测试用例 请找到我的pom。xml配置如下: 请找到E2E。xml如下:

  • 我无法使用maven运行spring boot应用程序的测试。我看过很多关于这个的帖子,他们的大多数解决方案是: 将junit版本与maven surefire插件或 确保junit版本不是由预定义的 我的项目不使用父级,也不使用专家-sure-fire插件。否则,根据pom文件,我没有看到任何明显的冲突。我确实看到了 ,但这是向后兼容性的纯复古依赖性的一部分。 是什么导致了这种情况? 砰的一声

  • 我需要做的是编写自动化测试,测试网络系统是否工作得足够快。(步骤不超过1s)。并且应该有大约100个并行系统用户。 为了实现这个目标,我使用了Selenium Webdriver,并学习了如何编写简单的测试(用Java),但存在两个主要问题: 1) 如何添加并行用户?如果我创建100个实例,PC就会崩溃。我读了一些关于selenium grid和TestNG的文章,但仍然不确定我真正需要什么。 2