Hibernate说表不';不存在,但它确实存在

Hibernate说表不';不存在,但它确实存在,hibernate,spring-boot,spring-data-jpa,Hibernate,Spring Boot,Spring Data Jpa,我遇到Hibernate抛出以下错误的问题: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Library.book' doesn't exist 我的依赖项设置如下所示(我相信这可能是原因): 因此,我使用SpringBootStarterWeb(使用SpringCLI创建的项目),然后为Hibernate和spring数据添加了非SpringBoot依赖项(在不同的项目中使用了完全相同的依赖项集,但没有S

我遇到Hibernate抛出以下错误的问题:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Library.book' doesn't exist
我的依赖项设置如下所示(我相信这可能是原因):

因此,我使用SpringBootStarterWeb(使用SpringCLI创建的项目),然后为Hibernate和spring数据添加了非SpringBoot依赖项(在不同的项目中使用了完全相同的依赖项集,但没有SpringBootStarterWeb,一切正常)

在阅读了其他人的问题后,我检查了@EnableJpaRepositories是否有正确的存储库路径,以及entityManagerFactoryBean是否正确设置了packagesToScan

我相信SpringBoot与其他依赖项有冲突,因为我的配置看起来很好

现在我将展示一些代码片段,因为我可能对配置的正确性有误解;p

书籍MySQL DDL:

CREATE TABLE IF NOT EXISTS `Library`.`Book` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(100) NOT NULL,
  `description` VARCHAR(256),
  `genre` VARCHAR(50) NOT NULL,
  `releaseDate` DATE NOT NULL,
  PRIMARY KEY (`id`)
)
账簿实体:

@Entity
@Table(name="Book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String title;
    private String description;
    private String genre;
    @Temporal(TemporalType.DATE)
    private Date releaseDate;
}
EntityManagerFactory bean:

@Bean
@Autowired(required = true)
public EntityManagerFactory entityManagerFactory(DataSource dataSource) {
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);
    vendorAdapter.setShowSql(false);
    vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
    vendorAdapter.setDatabase(Database.MYSQL);

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan("pl.com.imralav.library.data.entity");
    factory.setDataSource(dataSource);

    Properties properties = new Properties();
    properties.setProperty("hibernate.generate_statistics", "false");
    properties.setProperty("hibernate.show_sql", "false");

    factory.setJpaProperties(properties);

    factory.afterPropertiesSet();

    return factory.getObject();
}

如果您需要更多信息,请告诉我。

问题是我对Spring Boot的工作原理理解不足。它加载了一整套自动配置类,在我的例子中,为Hibernate设置了错误的命名策略。我所要做的就是排除Hibernate自动配置类

@SpringBootApplication(exclude={HibernateJpaAutoConfiguration.class})
突然间,一切都像我希望的那样工作了。 非常感谢@Nicolas用他的评论为我指出了正确的方向

让我吃惊的是,根据Spring Boot参考资料:

自动配置是非侵入性的,您可以在任何时候开始定义自己的配置,以替换自动配置的特定部分。例如,如果添加自己的DataSourceBean,默认的嵌入式数据库支持将退出


但在我的情况下,它不起作用。它工作得非常好,我只需要“覆盖”正确的bean(正如@Oliver所指出的)

如果你仔细看一下“Library.book”的小写字母是
book
。这可能与有一些改进有关,在将数据库名称更改为book之后,出现了新的错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:field list中的未知列“book0.release\u date”
,我试图通过使用@column(name=“releaseDate”)注释来修复它,但它不起作用(就像@Table(name=“book”)没有)。你知道为什么注释被忽略了吗?在通过更改图书模式(releaseDate而不是releaseDate)重新创建数据库之后,一切都很好。但我并不满意,因为我需要知道为什么有些注释有效(比如
@Entity
,因为书被映射到了数据库表),而有些注释无效(比如
@table
@Column
,它们没有让Hibernate查找其他表或其他列名).Spring boot默认Hibernate命名策略是Hibernate
改进命名策略
的一个扩展,
更喜欢嵌入下划线而不是混合大小写名称
(即驼峰大小写名称转换为下划线)。您可以使用属性
spring.jpa.hibernate.naming\u策略来覆盖。顺便说一句,我建议使用命名约定,在大写/小写中使用带名称的下划线。您能为我澄清一件事吗?当使用SpringBoot时,它会尝试自动配置任何依赖项,不管它是否是SpringBoot特定的依赖项?到目前为止,我一直认为要让spring boot进行自动配置,我需要添加一些特殊的spring boot版本的依赖项,比如我现在使用的spring boot starter web,它将只自动配置那些spring boot依赖项。禁用自动配置是可行的,如果您坚持公开
LocalContainerEntityManagerFactoryBean
而不是
EntityManagerFactory
的惯例,因为这是Boot的自动配置当前不希望找到的。我已经申请了这个案例,但是简单地切换到返回<代码> LCEMFB 应该使它像预期的那样工作。@ Tomek,你能为“我只需要”重写“正确的bean”(如@奥利弗所指出的那样)吗?
@SpringBootApplication(exclude={HibernateJpaAutoConfiguration.class})