it-swarm.com.ru

Spring Boot - Hibernate - Таблица не существует

У меня есть сторонняя банка, в которой хранятся все объекты и карты. В настоящее время я успешно использую этот jar в классическом приложении Spring-MVC, но сейчас я пытаюсь использовать его в приложении Spring-Boot. (1.5.7.RELEASE)

У меня есть это для моего Applicaion.Java:

@SpringBootApplication
@EntityScan(basePackages = "com.third.party.entity.package")
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
    }
}

Так как это сторонний разработчик, я также должен выполнить сканирование сеанса, поэтому он есть в моем классе @Configuration:

@Bean
public LocalSessionFactoryBean sessionFactory(EntityManagerFactory emf) throws ClassNotFoundException {
    LocalSessionFactoryBean fact = new LocalSessionFactoryBean();
    fact.setAnnotatedPackages("com.third.party.entity.package");
    fact.setPackagesToScan("com.third.party.entity.package");
    fact.setDataSource(dataSource);
    return fact;
}

и это в моем application.properties:

spring.datasource.url=jdbc:mysql://dbserver:3306/mydb?useSSL=false
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.Tomcat.max-wait=20000
spring.datasource.Tomcat.max-active=50
spring.datasource.Tomcat.max-idle=20
spring.datasource.Tomcat.min-idle=15
spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

Я получаю эту ошибку:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mydb.user' doesn't exist

Теперь имя таблицы «Пользователь», так что это имеет смысл. Тем не менее, я использую эту банку для другого приложения, поэтому все остальные 100 ответов по этому вопросу не применяются. 

Это ДОЛЖНА быть проблема конфигурации? Правильно? 

UPDATE Я попробовал @sam ответ ниже, но безрезультатно, но я смог посмотреть исходный код этого jar-файла третьей стороны, и он выглядит так:

@Entity
@Table(name = "User")
public class User {
     etc...
}

Поэтому имя таблицы в аннотации правильное. Как мне заставить Spring использовать это? Я ищу стратегии именования по умолчанию и прочее ... Есть предложения?

7
mmaceachran

Реальный ответ (для меня), который может помочь кому-то, - вовсе не использовать неявную стратегию именования. Если вы просто хотите использовать то, что аннотировано в классе сущности, используйте физический, например, такой:

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

Благодаря ответу @rsinha здесь:

Стратегия именования Hibernate изменяет имена таблиц

4
mmaceachran

Spring Boot - Hibernate - Таблица не существует

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mydb.user' **doesn't exist**

У меня проблема с вашей программой @EntityScan (basePackages = "com.third.party.entity .package"), где package недоступен для имени пакета в Java.

Остальное

Убедитесь, что ваш объект pojo user класс хорошо определен

@Entity
@Table(name = "User")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    ...
    }

Попробуйте добавить код строки ниже в application.properties и запустите

application.properties

# Hibernate ddl auto (create, create-drop, update, none): with "update" the database
# schema will be automatically updated accordingly to Java entities found in the project
spring.jpa.hibernate.ddl-auto = update

И исключить из класса автоконфигурации Hibernate, если он есть, добавив ниже Аннотация

@SpringBootApplication(exclude={HibernateJpaAutoConfiguration.class})

Это аналогичный вопрос типа по переполнению стека Hibernate говорит, что таблица не существует, но она существует

4
user4856296

У меня была та же проблема, но другое решение: по-видимому, Hibernate/JPA строчными буквами все буквы в имени таблицы. Так что, даже если мой стол был User и у меня было

@Entity
@Table(name = "User")
public class OfficeUser {
...
}

Я все еще получаю ошибку, говоря: 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'doctors_office.user' doesn't exist

Решением для меня было изменить имя таблицы в БД с User на user (верхний регистр -> нижний регистр)

ПРИМЕЧАНИЕ. Я использовал другое имя сущности для своей таблицы (вот почему у меня OfficeUser как имя класса и другое имя таблицы)

1
SnuKies

Я столкнулся с подобной проблемой, и причина была в том, что у моего Entity Object была переменная класса с именем «group», которая является ключевым словом mysql. Поскольку я не аннотировал его @Column, чтобы дать другое имя, он был вынужден использовать «группу» в качестве имени столбца. Решение было простым, чтобы аннотировать переменную класса с помощью @Column, чтобы дать ей другое имя.

До

 private String group;

После

  @Column(name="groupName")
    private String group;
0
Vaibs