Hibernate说该表不存在,但确实存在

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

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Library.book' doesn't exist

我的依赖项设置如下所示(我相信这可能是原因):

compile("org.springframework.boot:spring-boot-starter-web")

testCompile("org.springframework.boot:spring-boot-starter-test")

compile 'org.springframework:spring-orm:4.1.6.RELEASE'

compile 'org.springframework.data:spring-data-jpa:1.8.0.RELEASE'

compile 'org.hibernate:hibernate-entitymanager:4.3.8.Final'

compile 'org.hibernate:hibernate-core:4.3.8.Final'

compile 'org.apache.commons:commons-dbcp2:2.1'

compile 'mysql:mysql-connector-java:5.1.35'

compile 'org.apache.logging.log4j:log4j-core:2.2'

因此,我正在使用spring-boot-starter-web(使用Spring CLI创建的项目),然后为Hibernate和Spring

Data添加了非spring-boot依赖关系(在不同项目中使用了完全相同的依赖关系集,但没有spring- boot-starter-web,一切正常。

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

我相信Spring Boot与其他依赖项存在冲突,因为我的配置看起来不错。

现在,我将显示一些代码片段,因为我可能对配置的正确性不满意; 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 Reference:

自动配置是非侵入性的,您可以随时开始定义自己的配置以替换自动配置的特定部分。例如,如果添加自己的DataSource

bean,则默认的嵌入式数据库支持将消失。

但就我而言,它不起作用。 并且它工作得很好,我只需要“覆盖”正确的bean(如@Oliver所指出的)

以上是 Hibernate说该表不存在,但确实存在 的全部内容, 来源链接: utcz.com/qa/398283.html

回到顶部