【问题标题】:Hibernate not creating Table automatically in spring boot using postgresqlHibernate 不会在 Spring Boot 中使用 postgresql 自动创建表
【发布时间】:2016-05-26 11:07:45
【问题描述】:

我想将数据保存到 postgresql 中的表中。我正在使用spring boot + postgresqlhibernate。我的应用程序没有任何错误,但它没有在数据库中创建表。

这是我的控制器类

    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 类

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;
    }

}

我想将数据保存到 postgresql 中的表中。我正在使用 spring boot + postgresql 和 hibernate。我的应用程序没有任何错误,但它没有在数据库中创建表。

【问题讨论】:

  • 在您的 hibernate.hbm2ddl.auto 中,将其设置为 update 。另外,如果你有 Postgresql,为什么要使用 MySQl 方言,去 PostgreSQL9Dialect。
  • 我试过它不起作用
  • org.hibernate.dialect.PostgreSQLDialect 我现在正在使用这种方言但仍然没有创建表
  • 您可以发布您的hibernate.cfg.xml 文件吗?
  • 通过编辑您的主帖发布更新的代码。另外,您在模型中添加了哪些列?正如拉曼所说,你能发布hibernate.cfg.xml吗?

标签: java spring hibernate postgresql


【解决方案1】:

问题是您使用了错误的注释,即@component。
删除此注释并使用@Entity。

这是您的代码。
执行此代码后检查日志,您将看到 hibernate 没有触发 sql create 查询。

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)

现在用@Entity 注解替换@Component 并查看日志。

@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 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.

【讨论】:

    【解决方案2】:

    您正在“使用”Spring Boot,而您要做的第一件事就是尽量不使用 Spring Boot。

    让 Spring Boot 为您完成繁重的工作,而不是自己完成所有配置。

    在您的application.properties 中设置正确的方言并使用正确的属性(有关属性的完整列表,请参阅 Spring Boot 参考指南的this section)。

    # 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
    

    并删除破坏 Spring Boot 自动配置的自定义配置(即 AppConfigSettingConfig)。

    【讨论】:

      【解决方案3】:

      我在您的 POJO 中没有看到任何列定义,您如何期望 hibernate 通过简单地提供 Java 类型(例如 String)来知道要创建哪种类型的列?对于我的 MySQL 数据库,我会像这样定义 POJO

      @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;
      
        ...
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-15
        • 2021-10-21
        • 2021-08-13
        • 2016-10-21
        • 1970-01-01
        • 2022-08-18
        • 2020-06-25
        • 2016-10-29
        • 2016-11-12
        相关资源
        最近更新 更多