spring boot + JPA + MySql + Entity 表生成大写

Posted

技术标签:

【中文标题】spring boot + JPA + MySql + Entity 表生成大写【英文标题】:springboot + JPA + MySql + Entity table generated uppercase 【发布时间】:2019-09-14 08:16:34 【问题描述】:

有一个问题,在 SpringBoot 2.1.4 JPA 中使用 Hibernate to mysql 生成大写表名,并且我不断收到错误,即 CONTENTSET 无法识别该表。 MySql 中真实的表名是小写的contentset

从日志文件生成的 sql 看起来不错,但我的测试保持错误并抱怨大写表名。这是MySql数据库,对表名是区分大小写的。

这是日志信息文本

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "CONTENTSET" not found; SQL statement:
select contentset0_.contentsetid as contents1_1_, contentset0_.checksum as checksum2_1_, contentset0_.contentsetname as contents3_1_, contentset0_.zipped as zipped4_1_ from contentset contentset0_ [42102-199]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:451)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
    at org.h2.message.DbException.get(DbException.java:205)

实体 Bean

@Entity
@Table(name = "contentset")
public class ContentSet implements Serializable 

    @Id
    @Column(name="CONTENTSETID")
    private String contentSetId;

    @Column(name="CONTENTSETNAME", nullable=false)
    private String contentSetName;
    ......

ContentSetRepository.java 文件

public interface ContentSetRepository extends JpaRepository<ContentSet, String>  

我的 application.properties 测试

spring.datasource.url=jdbc:mysql://10.80.100.62:3306/receiver
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto = none
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

# NOTHING SEEMS TO RESOLVE UPPERCASE TABLE name
#spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

我的测试一直失败

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.AUTO_CONFIGURED)  
@TestPropertySource(locations = "classpath:application.properties")
public class ContentSetRepositoryMySqlTest 

    @Autowired private ContentSetRepository contentSetRepo;

    @Test
    public void testFindAll_For_ContentSetRepository() 
        Assertions.assertThat(contentSetRepo).isNotNull();

        try 
            Collection<ContentSet> all = contentSetRepo.findAll();
            Assertions.assertThat(all).isNotNull();
            Assertions.assertThat(all.size()).isGreaterThan(0);
         catch(Exception ex ) 
            ex.printStackTrace();
            Assertions.fail("Exception : " + ex.getMessage());
        
    

【问题讨论】:

【参考方案1】:

也许您在 pom.xml 中包含了 H2 数据库依赖项,或者您可能有与 H2 数据库有关的 bean,因此错误提示:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "CONTENTSET" not found; SQL statement:

表名和列名在 H2 中区分大小写,但在 MySQL 中不区分大小写。你能用你的 pom.xml 的内容更新问题吗?

【讨论】:

你知道的;我相信你是对的。我需要进一步追捕。 我的问题与 h2 和 MySql 驱动程序的冲突有关。 H2 妨碍并抱怨表名无法识别,因为 JPA 将其转换为大写。我能够在我的测试中使用 @AutoConfigureTestDatabase(replace=Replace.NONE) 解决这个问题

以上是关于spring boot + JPA + MySql + Entity 表生成大写的主要内容,如果未能解决你的问题,请参考以下文章

spring boot jpa 访问 mysql

Spring Boot、JPA 和 MySQL 返回空结果

spring boot + JPA + MySql + Entity 表生成大写

spring boot 通过jpa连接mysql失败

Spring Boot 最佳实践Spring Data JPA 操作 MySQL 8

spring boot+spring data jpa+gradle+mysql配置问题