2

I want to save data to a table in postgresql. I am using spring boot + postgresql along with hibernate. My Application does not have any error but it is not creating table in database.

This is my controller class

    package com.ge.health.poc.controlleer;

    import java.io.IOException;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;

    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.ge.health.poc.model.Bookmodel;
    import com.ge.health.poc.service.BookServiceImplementation;

    @RestController
    public class HttpController {

        @Autowired
        BookServiceImplementation bookserviceimpl;

        @RequestMapping(value = "/httpmethod", method = RequestMethod.POST)
        @ResponseBody
        public void helloService(@RequestBody String input) throws JsonParseException, JsonMappingException, IOException {
            System.out.println(input);
            ObjectMapper mapper = new ObjectMapper();
            Bookmodel pojodata = mapper.readValue(input, Bookmodel.class);

            System.out.println(pojodata);

        }
    }

AppConfig.java

    package com.ge.health.poc.configuration;

    import java.util.Properties;

    import javax.annotation.Resource;
    import javax.jms.ConnectionFactory;
    import javax.sql.DataSource;

    import org.springframework.context.annotation.Bean;
    import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

    public class AppConfig {

        @Resource
        private SettingConfig settings;

        @Bean
        JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
            return new JmsTemplate(connectionFactory);
        }

        @Bean
        public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(settings.getDriverClassName());
            dataSource.setUrl(settings.getDatasource());
            dataSource.setUsername(settings.getUsername());
            dataSource.setPassword(settings.getPassword());
            return dataSource;
        }

        /**
         * Declare the JPA entity manager factory.
         */
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

            // Hibernate properties
            Properties additionalProperties = new Properties();
            additionalProperties.put("hibernate.dialect", settings.getDialect());
            additionalProperties.put("hibernate.show_sql", settings.getShowsql());
            additionalProperties.put("hibernate.hbm2ddl.auto", settings.getDdlauto());
            entityManagerFactory.setJpaProperties(additionalProperties);

            return entityManagerFactory;
        }

        /**
         * Declare the transaction manager.
         */
        @Bean
        public JpaTransactionManager transactionManager() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
            return transactionManager;
        }

        /**
         * PersistenceExceptionTranslationPostProcessor is a bean post processor
         * which adds an advisor to any bean annotated with Repository so that any
         * platform-specific exceptions are caught and then rethrown as one Spring's
         * unchecked data access exceptions (i.e. a subclass of
         * DataAccessException).
         */
        @Bean
        public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
            return new PersistenceExceptionTranslationPostProcessor();
        }
    }

SettingConfig.java

    package com.ge.health.poc.configuration;

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;

    @Component
    public class SettingConfig {

        public String getDdlauto() {
            return ddlauto;
        }

        public void setDdlauto(String ddlauto) {
            this.ddlauto = ddlauto;
        }

        public String getShowsql() {
            return showsql;
        }

        public void setShowsql(String showsql) {
            this.showsql = showsql;
        }

        public String getDialect() {
            return dialect;
        }

        public void setDialect(String dialect) {
            this.dialect = dialect;
        }

        @Value("${spring.datasource.url}")
        private String datasource;

        @Value("${hibernate.hbm2ddl.auto}")
        private String ddlauto;

        @Value("${hibernate.show_sql}")
        private String showsql;

        @Value("{hibernate.dialect}")
        private String dialect;

        @Value("${spring.datasource.username}")
        private String username;

        @Value("${spring.datasource.password}")
        private String password;

        @Value("${spring.datasource.driver-class-name}")
        private String driverClassName;

        public String getDatasource() {
            return datasource;
        }

        public void setDatasource(String datasource) {
            this.datasource = datasource;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getDriverClassName() {
            return driverClassName;
        }

        public void setDriverClassName(String driverClassName) {
            this.driverClassName = driverClassName;
        }

    }

application.properties

    # Database
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.datasource.url=jdbc:postgresql://localhost:5432/bookdetails
    spring.datasource.username=postgres
    spring.datasource.password=admin
    # Hibernate
    hibernate.dialect=org.hibernate.dialect.MySQLDialect
    hibernate.show_sql=true
    hibernate.hbm2ddl.auto=create

POJO class

package com.ge.health.poc.model;

import javax.persistence.Column;
import javax.persistence.Table;

import org.springframework.data.annotation.Id;
import org.springframework.stereotype.Component;

@Component
@Table
public class Bookmodel {

    @Id
    private String id;
    @Column
    private String name;
    @Column
    private String isbn;
    @Column
    private String author;
    @Column
    private String pages;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPages() {
        return pages;
    }

    public void setPages(String pages) {
        this.pages = pages;
    }

    @Override
    public String toString() {
        return "Bookmodel [id=" + id + ", name=" + name + ", isbn=" + isbn + ", author=" + author + ", pages=" + pages
                + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

}

I want to save data to a table in postgresql.I am using spring boot + postgresql along with hibernate. My Application donot have any error but it is not creating table in database.

M. Deinum
  • 115,695
  • 22
  • 220
  • 224
Priyanka Taneja
  • 157
  • 2
  • 3
  • 13

3 Answers3

1

The problem is that you are using wrong annotation i.e @component.
Remove this annotation and use @Entity.

This is your code.
After executing this code check the logs, you will see no sql create query is fired by hibernate.

package com.example.demo.hibernateDemoEntity;
import javax.persistence.*;
import org.springframework.stereotype.Component;

@Component
@Table
public class Bookmodel {
@Id
private int id;
@Column
private String name;
@Column
private String isbn;
@Column
private String author;
@Column
private String pages;
}





 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2019-09-01 16:52:15.532  INFO 5436 --- [           main] c.example.demo.HibernateDemoApplication  : Starting HibernateDemoApplication on BGINMAC004.local with PID 5436 (/Users/Dildeep.Singh/Documents/workspace-sts-3.9.9.RELEASE/HibernateDemo/target/classes started by Dildeep.Singh in /Users/Dildeep.Singh/Documents/workspace-sts-3.9.9.RELEASE/HibernateDemo)
2019-09-01 16:52:15.536  INFO 5436 --- [           main] c.example.demo.HibernateDemoApplication  : No active profile set, falling back to default profiles: default
2019-09-01 16:52:16.331  INFO 5436 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-09-01 16:52:16.350  INFO 5436 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 12ms. Found 0 repository interfaces.
2019-09-01 16:52:16.730  INFO 5436 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$de6750d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-09-01 16:52:17.026  INFO 5436 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-09-01 16:52:17.049  INFO 5436 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-09-01 16:52:17.050  INFO 5436 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.22]
2019-09-01 16:52:17.156  INFO 5436 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-09-01 16:52:17.156  INFO 5436 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1581 ms
2019-09-01 16:52:17.355  INFO 5436 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-09-01 16:52:17.805  INFO 5436 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-09-01 16:52:17.844  INFO 5436 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2019-09-01 16:52:17.894  INFO 5436 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.10.Final}
2019-09-01 16:52:17.895  INFO 5436 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2019-09-01 16:52:18.056  INFO 5436 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-09-01 16:52:18.147  INFO 5436 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2019-09-01 16:52:18.388  INFO 5436 --- [           main] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@43a09ce2'
2019-09-01 16:52:18.390  INFO 5436 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-09-01 16:52:18.657  INFO 5436 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-09-01 16:52:18.690  WARN 5436 --- [           main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2019-09-01 16:52:18.883  INFO 5436 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-09-01 16:52:18.886  INFO 5436 --- [           main] c.example.demo.HibernateDemoApplication  : Started HibernateDemoApplication in 18.83 seconds (JVM running for 24.343)

Now replace @Component with @Entity annotation and see the logs.

@Entity
@Table
public class Bookmodel {

    @Id
    private int id;
    @Column
    private String name;
    @Column
    private String isbn;
    @Column
    private String author;
    @Column
    private String pages;
}

Spring Logs

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2019-09-01 17:10:59.943  INFO 5461 --- [           main] c.example.demo.HibernateDemoApplication  : Starting HibernateDemoApplication on BGINMAC004.local with PID 5461 (/Users/Dildeep.Singh/Documents/workspace-sts-3.9.9.RELEASE/HibernateDemo/target/classes started by Dildeep.Singh in /Users/Dildeep.Singh/Documents/workspace-sts-3.9.9.RELEASE/HibernateDemo)
2019-09-01 17:10:59.946  INFO 5461 --- [           main] c.example.demo.HibernateDemoApplication  : No active profile set, falling back to default profiles: default
2019-09-01 17:11:00.629  INFO 5461 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-09-01 17:11:00.649  INFO 5461 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 13ms. Found 0 repository interfaces.
2019-09-01 17:11:00.996  INFO 5461 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$d77725a9] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-09-01 17:11:01.227  INFO 5461 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-09-01 17:11:01.249  INFO 5461 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-09-01 17:11:01.249  INFO 5461 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.22]
2019-09-01 17:11:01.357  INFO 5461 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-09-01 17:11:01.357  INFO 5461 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1374 ms
2019-09-01 17:11:01.519  INFO 5461 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-09-01 17:11:01.919  INFO 5461 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-09-01 17:11:01.958  INFO 5461 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2019-09-01 17:11:02.006  INFO 5461 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.10.Final}
2019-09-01 17:11:02.010  INFO 5461 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2019-09-01 17:11:02.182  INFO 5461 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-09-01 17:11:02.283  INFO 5461 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
**Hibernate: drop table if exists bookmodel
Hibernate: create table bookmodel (id integer not null, author varchar(255), isbn varchar(255), name varchar(255), pages varchar(255), primary key (id)) engine=MyISAM**
2019-09-01 17:11:02.893  INFO 5461 --- [           main] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@134f8ef6'
2019-09-01 17:11:02.895  INFO 5461 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-09-01 17:11:03.209  INFO 5461 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-09-01 17:11:03.239  WARN 5461 --- [           main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2019-09-01 17:11:03.442  INFO 5461 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-09-01 17:11:03.445  INFO 5461 --- [           main] c.example.demo.HibernateDemoApplication  : Started HibernateDemoApplication in 18.81 seconds (JVM running for 24.307)


Now you can see sql create query is fired by hibernate.
Jeremy Trpka
  • 322
  • 1
  • 4
  • 20
0

You are "using" Spring Boot and the first thing you do is try very hard not to use Spring Boot.

Instead of doing all the configuration by yourself let Spring Boot do the heavy lifting for you.

In your application.properties set the proper dialect and use the correct properties (see this section of the Spring Boot Reference Guide for a full list of properties).

# Database
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/bookdetails
spring.datasource.username=postgres
spring.datasource.password=admin

# Hibernate
spring.jpa.database=org.hibernate.dialect.PostgreSQL94Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create

And remove your custom configuration (i.e. the AppConfig and SettingConfig) that breaks the auto configuration of Spring Boot.

M. Deinum
  • 115,695
  • 22
  • 220
  • 224
-1

I don't see any column definition in your POJO, how do you expect hibernate to know what type of column to create by simply give a Java type such as String? For my MySQL database I would define POJO like this

@Component
@Table(name = "Book")
public class Bookmodel {

  @Size(max = 32)
  @Id
  @Column(columnDefinition = "varchar(128)", nullable = false, unique = true)
  private String id;

  @Column(columnDefinition = "varchar(128)", nullable = false)
  private String name;

  ...
}
Tao Dong
  • 206
  • 3
  • 9