springboot + JPA + MySql + таблица сущностей, сгенерированная заглавными буквами - PullRequest
1 голос
/ 25 апреля 2019

Возникла проблема, когда в SpringBoot 2.1.4 JPA, использующий Hibernate для MySql, генерирует имена таблиц в верхнем регистре, и я продолжаю получать сообщение об ошибке, что таблица не распознается для CONTENTSET . Настоящее имя таблицы в MySql - строчные буквы contentset .

sql, который создается из файла журнала, выглядит хорошо, но мой тест не допускает ошибок с жалобами на имя таблицы UPPERCASE. Это база данных 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)

Сущность Бин

@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> { }

тест my 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 Ответ

1 голос
/ 25 апреля 2019

Возможно, вы включили зависимость базы данных H2 в ваш файл pom.xml или у вас могут быть bean-компоненты, которые имеют какое-то отношение к базе данных H2, поэтому ошибка говорит:

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

Имена таблиц и столбцов чувствительны к регистру в H2, но не в MySQL. Не могли бы вы обновить вопрос с содержанием вашего pom.xml.

...