5

I use Spring 4.3.3.RELEASE, Hibernate 5.2.2.Final, the database is MySQL. I wanted to try strategy = GenerationType.TABLE. As I know for GenerationType.SEQUENCE I need sequences in the database to generate ids.

This is my entity.

@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 annotation configuration

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

Spring xml configuration

<?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>

When I run my application, I get

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
Yan Khonski
  • 12,225
  • 15
  • 76
  • 114
  • use @Table annotation..`@Table(name = "tabName ") @Entity(name = CommentTable.TABLE_NAME) public class Comment {` – Prasanna Kumar H A Sep 24 '16 at 11:20
  • 3
    It works if I use **GenerationType.IDENTITY**. – Yan Khonski Sep 24 '16 at 11:21
  • Oh, Sam, thanks for suggestion. Unfortunately, I can't. We have a large project, and switching from the [at]Entity into [at]Table will not be quick and easy. http://stackoverflow.com/questions/18732646/name-attribute-in-entity-and-table – Yan Khonski Sep 24 '16 at 11:24
  • 1
    `@GeneratedValue(strategy=GenerationType.TABLE, generator="????")` – Prasanna Kumar H A Sep 24 '16 at 11:27
  • Yes, I agree, this is how we do with PostgreSQL. Now I am doing this with MySQL. – Yan Khonski Sep 24 '16 at 11:28
  • 1
    Which means `GenerationType.Table` doesn't work for Mysql??? – Prasanna Kumar H A Sep 24 '16 at 11:30
  • It works Jan khonski...take a look [here](http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-table-hibernate) and its hibernate-cfg.xml – Prasanna Kumar H A Sep 24 '16 at 11:34
  • 1
    I thought I would leave this here as I recently received this same error. You can see this error if you've pointed to an empty schema (no tables), but have accidentally left hibernate.ddl-auto set to validate, instead of a setting to create the tables. This isn't the case with the poster above, but I found this thread by searching for "missing table [hibernate_sequence]". – Loathian Aug 29 '17 at 18:16

3 Answers3

9

The exception is occured because you haven't mentioned generator in @GeneratedValue..Below is the example

    @GeneratedValue(strategy=GenerationType.TABLE, generator="course")
        @TableGenerator(
                name="course",
                table="GENERATOR_TABLE",
                pkColumnName = "key",
                valueColumnName = "next",
                pkColumnValue="course",
                allocationSize=30
            )
    private int id;
Prasanna Kumar H A
  • 3,341
  • 6
  • 24
  • 52
2

I solved it by using the property

spring:
  jpa:
    hibernate:
      use-new-id-generator-mappings: false

I was using spring boot V2.5.9

With this setting the hibernate sequence is generated if missing. Then also no need for the @GeneratedValue annotation.

Jan
  • 61
  • 6
0

I had to keep this project in runnable mode before I start working on my actual task, I have solved this exception and started my application with following steps:

  1. Created a new database schema in my local MYSQL server. and added it to properties file.
  2. Changed hibernate dialect to org.hibernate.dialect.MySQL5Dialect
  3. Changed spring.jpa.hibernate.ddl-auto from "validate" to "create-drop" option
  4. Restarted the Application.

Actual problem that I understood is, the existing database schema had tables, constraints and data which is not in sync with my current code.

My Goal is to make my application to Start and these steps helped me.

Amulya Koppula
  • 150
  • 1
  • 5