Hibernate 不会在 Spring Boot 中使用 postgresql 自动创建表

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35411070/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-21 02:10:28  来源:igfitidea点击:

Hibernate not creating Table automatically in spring boot using postgresql

javaspringhibernatepostgresql

提问by Priyanka Taneja

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

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

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.Hymanson.core.JsonParseException;
    import com.fasterxml.Hymanson.databind.JsonMappingException;
    import com.fasterxml.Hymanson.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

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

}

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.

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

回答by Dildeep Singh

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

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

This is your code.
After executing this code check the logs, you will see no sql create query is fired by 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)

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

现在用@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 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.

回答by M. Deinum

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

您正在“使用”Spring Boot,并且您要做的第一件事就是非常努力地不使用 Spring Boot。

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

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

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

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

# 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 AppConfigand SettingConfig) that breaks the auto configuration of Spring Boot.

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

回答by Tao Dong

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

我在您的 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;

  ...
}