Spring Boot - Hibernate - 表不存在

时间:2017-10-07 23:13:02

标签: java spring hibernate spring-boot spring-data-jpa

我有一个第三方jar,它包含所有实体和映射。我目前在经典的Spring-MVC应用程序中成功使用此jar,但现在我尝试在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

现在表名是"用户"这样才有意义。但是,我正在将此jar用于其他应用程序,因此关于此主题的所有其他100个答案都不适用。

必须是配置问题?对?

更新 我在下面尝试@sam回答无济于事,但我能够看到这个第三方jar文件的源代码,它看起来像这样:

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

因此注释中的表名是正确的。我如何让Spring使用它?我正在寻找默认的命名策略和东西...任何建议?

5 个答案:

答案 0 :(得分:7)

对我来说可能有帮助的真正答案是根本不使用隐式命名策略。如果您只想使用实体类中的注释,请使用如下物理实体:

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

感谢@rsinha的回答:

Hibernate naming strategy changing table names

答案 1 :(得分:5)

  

Spring Boot - Hibernate - 表不存在

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

我认为你的程序问题@EntityScan(basePackages =" com.third.party.entity。 package ")不正确不能作为java中的包名接受。

<强>否则

确保您的pojo实体用户类已正确定义

@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 AutoConfiguration类(如果存在)

@SpringBootApplication(exclude={HibernateJpaAutoConfiguration.class})

此问题与Hibernate says that table doesn't exist but it does

类似

答案 2 :(得分:3)

我遇到了同样的问题,但是有一个不同的解决方案:显然,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作为类的名称和不同的表名称)

答案 3 :(得分:0)

我遇到了类似的问题,原因是我的实体对象有一个名为“ group”的类变量,这是一个mysql关键字。由于我没有使用@Column注释它来提供其他名称,因此它被迫使用“ group”作为列名。解决方案很简单,可以使用@Column注释类变量以为其提供不同的名称。

之前

 private String group;

之后

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

答案 4 :(得分:0)

我尝试了上面的所有解决方案,但最终错误是由更简单的原因引起的。

隐藏在异常Stacktrace中,我发现模型中的属性之一被命名为SQL保留字。这阻止了表的创建。

  

重命名属性可以解决此问题。