当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL Hibernate Spring自动创建数据库

范翰池
2023-03-14

我正在使用PostgreSQL和Spring 4,并希望我的应用程序在运行时自动创建数据库。

我的实体类是:

@Entity
@Table(name = "user", schema = "public")
public class User extends BaseEntity {

    private Integer id;
    private String name;
    private Integer contractId;

    public User() {
    }

    public User(Integer id) {
        super(id);
    }

    @Id
    @Column(name = "usr_id", nullable = false)
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

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

    @Basic
    @Column(name = "usr_name", nullable = true, length = -1)
    public String getName() {
        return name;
    }

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

    @Basic
    @Column(name = "usr_contract_id", nullable = true)
    public Integer getContractId() {
        return contractId;
    }

    public void setContractId(Integer contractId) {
        this.contractId = contractId;
    }

}

HibernateConfig。Java语言

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@PropertySources({
    @PropertySource(value = "classpath:application.properties")})
@ConfigurationProperties(prefix = "spring.datasource")
public class HibernateConfig {

    @Autowired
    private Environment environment;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private MultiTenantConnectionProvider multiTenantConnectionProvider;

    @Autowired
    private CurrentTenantIdentifierResolver currentTenantIdentifierResolver;

    public HibernateConfig() {}

    @Bean
    public LocalSessionFactoryBean sessionFactory() throws Exception {

        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setHibernateProperties(hibernateProperties());

        sessionFactory.setPackagesToScan(new String[] {
            "com.xxx.xxx.model",
        });

        return sessionFactory;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put(DIALECT, environment.getRequiredProperty(DIALECT));
        properties.put(SHOW_SQL, environment.getRequiredProperty(SHOW_SQL));
        properties.put(FORMAT_SQL, environment.getRequiredProperty(FORMAT_SQL));
        properties.put(HBM2DDL_AUTO, environment.getRequiredProperty(HBM2DDL_AUTO));

        return properties;
    }

    @Bean
    @Primary
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory s) {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(s);
        return txManager;
    }

    @Bean
    @Autowired
    public HibernateTemplate hibernateTemplate(SessionFactory s) {
        HibernateTemplate hibernateTemplate = new HibernateTemplate(s);
        return hibernateTemplate;
    }
}

application.properties

# Database connection settings:
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/database
jdbc.username=postgres
jdbc.password=111111

hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=false
hibernate.format_sql=false
hibernate.hbm2ddl.auto=update

spring.datasource.initialSize=50
spring.datasource.maxActive=200
spring.datasource.maxIdle=200
spring.datasource.minIdle=50

但当我运行SQL访问表User时,会出现错误:表“User”不存在。

如何使Hibernate自动创建数据库?

共有3个答案

晏德佑
2023-03-14

属性hibernate.hbm2ddl.auto将为您完成任务。它会在创建SessionFactory时自动验证模式DDL或将其导出到数据库。使用create-drop,当SessionFactory显式关闭时,数据库模式将被删除。

Hibernate可以接受上述属性的这些选项。

验证:验证架构,不对数据库进行任何更改。

update:更新架构。

create:创建模式,销毁以前的数据。

create-drop:在会话结束时删除架构。

艾俊晖
2023-03-14

这样试试

spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect

spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url= jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=123

spring.jpa.show-sql=true
spring.session.store-type=none

这是我的工作。

从《Hibernate用户指南》的自动架构生成部分:

javax。坚持不懈架构生成。数据库操作

设置为在SessionFactory生命周期中自动执行SchemaManagementTool操作。有效选项由操作枚举的externalJpaName值定义:

>

  • 没有-不会执行任何操作。

    创建-将生成数据库创建。

    将生成数据库删除。

    drop-and-create-将生成数据库删除,然后创建数据库。

    spring.jpa.hibernate.ddl自动更新

  • 华良平
    2023-03-14

    与mysql不同,Postgres不支持创建数据库(如果不存在)。

    因此,更改hibernate.hbm2ddl.auto=create和更改URLjdbc.url=jdbc:postgresql://localhost/database?createDatabaseIfNotExist=true不适合您。

    但是,您可以尝试模拟以下问题中的行为:

    如果使用Hibernate不存在,请动态创建Postgres数据库

    是否为PostgreSQL模拟创建数据库?

     类似资料:
    • 问题内容: 我正在使用PostgreSQL和Spring 4,希望我的应用在运行时自动创建数据库。 我的实体类是: HibernateConfig.java application.properties 但是,当我运行SQL访问表User时,将出现错误:表’User’不存在。 如何使Hibernate自动创建数据库? 问题答案: 该物业将为您解决问题。创建SessionFactory时,它将自动验

    • 当应用程序启动时,我正在尝试创建mysql数据库。我尝试了波纹管配置,但无法实现,如果有人对此有想法,请告诉我,

    • 我有一个简单的问题,是否可以为MySQL或其他数据库使用spring-boot数据r2dbc自动生成表?在JPA中,我添加了spring.JPA.hhibernate。ddl-auto=更新并创建表 这是我的pom:

    • 我有一个 Spring 引导 API,它使用 jpa 和 postgresql,并在我运行应用程序时自动创建表。 但出现以下错误消息: 这是我的应用程序。属性

    • 问题内容: 我无法启动启动时自动启动数据库架构的Spring Boot。 这是我的application.properties: 这是我的Application.java: 这是一个示例实体: 有什么想法我做错了吗? 问题答案: 有几种可能的原因: 您的实体类位于与之相对的同一个子包中,或者在一个子包中,如果没有,则您的spring应用不会看到它们,因此不会在db中创建任何内容 检查您的配置,似乎

    • 问题内容: http://www.vaannila.com/spring/spring-hibernate- integration-1.html 在阅读本教程时,他们没有提到在数据库中创建表的任何内容。一旦我指定了表和字段,Hibernate会自动处理它吗? 这是我的bean配置。 问题答案: 您的hibernate.hbm2ddl.auto设置应该确定所创建的数据库(选项为,,或者)