模式验证:缺少表 [hibernate_sequences]

Posted

技术标签:

【中文标题】模式验证:缺少表 [hibernate_sequences]【英文标题】:Schema-validation: missing table [hibernate_sequences] 【发布时间】:2017-02-02 04:42:29 【问题描述】:

我用的是Spring 4.3.3.RELEASE,Hibernate 5.2.2.Final,数据库是mysql。 我想尝试strategy = GenerationType.TABLE。我知道 GenerationType.SEQUENCE 我需要数据库中的序列来生成 ID。

这是我的实体。

@Entity(name = CommentTable.TABLE_NAME)
public class Comment 

    private Integer id;
    private String title;
    private String message;
    private LocalDateTime createdDateTime;
    private Issue issue;


   public Comment() 
   

   @Id
   @GeneratedValue(strategy = GenerationType.TABLE)
   @Column(name = CommentTable.COLUMN_ID, unique = true, nullable = false)
   public Integer getId() 
       return id;
   

   public void setId(Integer id) 
       this.id = id;
   
//Other getters and setters.

Spring注解配置

@Configuration
@ComponentScan("com.ita.training.otm") 
@ImportResource("classpath:/config.xml") // XML with DataSource bean
@EnableTransactionManagement
public class AppConfiguration 

Spring xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="emf"      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.ita.training.otm.core.model" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">validate</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            </props>
        </property>
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/spring_test" />
        <property name="username" value="user" />
        <property name="password" value="1111" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="emf" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:annotation-driven />

</beans>

当我运行我的应用程序时,我得到了

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'emf' defined in class path resource [config.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)
at com.ita.training.otm.app.Main.main(Main.java:10)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:951)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:881)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
... 11 more
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [hibernate_sequences]
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:125)
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.performValidation(SchemaValidatorImpl.java:95)
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:62)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:65)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:307)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:490)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:878)
... 17 more

【问题讨论】:

使用@Table注解..@Table(name = "tabName ") @Entity(name = CommentTable.TABLE_NAME) public class Comment 如果我使用 GenerationType.IDENTITY 就可以了。 @GeneratedValue(strategy=GenerationType.TABLE, generator="????") 这意味着GenerationType.Table不适用于Mysql??? 我想我会把它留在这里,因为我最近收到了同样的错误。如果您指向一个空架构(没有表),但不小心将 hibernate.ddl-auto 设置为验证,而不是创建表的设置,您会看到此错误。上面的海报不是这种情况,但我通过搜索“missing table [hibernate_sequence]”找到了这个帖子。 【参考方案1】:

出现异常是因为你在@GeneratedValue中没有提到generator..下面是例子

    @GeneratedValue(strategy=GenerationType.TABLE, generator="course")
        @TableGenerator(
                name="course",
                table="GENERATOR_TABLE",
                pkColumnName = "key",
                valueColumnName = "next",
                pkColumnValue="course",
                allocationSize=30
            )
    private int id;

【讨论】:

【参考方案2】:

在开始执行实际任务之前,我必须将此项目保持在可运行模式,我已经解决了这个异常并通过以下步骤启动了我的应用程序:

    在我的本地 MYSQL 服务器中创建了一个新的数据库模式。并将其添加到属性文件中。 将休眠方言更改为 org.hibernate.dialect.MySQL5Dialect 将 spring.jpa.hibernate.ddl-auto 从“validate”更改为“create-drop”选项 重新启动应用程序。

我理解的实际问题是,现有的数据库架构中的表、约束和数据与我当前的代码不同步。

我的目标是让我的应用程序开始,这些步骤帮助了我。

【讨论】:

以上是关于模式验证:缺少表 [hibernate_sequences]的主要内容,如果未能解决你的问题,请参考以下文章

缺少序列或表:hibernate_sequence

Spring Boot gradle flyway - 验证错误 - 模式验证:缺少表

SchemaManagementException:模式验证:即使数据库中存在表,也缺少表 [chk_groups]

模式验证:使用 Hibernate 序列生成器策略时缺少表 [SEQUENCE_NAME]

如何解决异常:表 'DBNAME.hibernate_sequence' 不存在

消息 -“无法读取 hi 值 - 您需要填充表:hibernate_sequence”