【问题标题】:Caused by: org.postgresql.util.PSQLException: database doesn't exist when trying to auto-create database原因:org.postgresql.util.PSQLException:尝试自动创建数据库时数据库不存在
【发布时间】:2026-01-26 08:55:02
【问题描述】:

我有这个hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">org.postgresql.Driver</property>

        <property name="connection.url">
            jdbc:postgresql://localhost/DatabaseName?createDatabaseIfNotExist=true
                &amp;useUnicode=yes&amp;characterEncoding=UTF-8
        </property>

        <property name="connection.username">postgres</property>
        <property name="connection.password">password</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">5</property>
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.PostgreSQL9Dialect</property>
        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCachingRegionFactory</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>
        <mapping class="com.main.User"/>
    </session-factory>
</hibernate-configuration>

应该创建两个表(用于User 实体和数据库DatabaseName)。但是,它不会创建数据库并且失败并在此行出现错误:

sessionFactory = configuration.buildSessionFactory();

我该怎么做才能让它自动创建名为 DatabaseName 的数据库?

【问题讨论】:

  • 从您的应用程序创建数据库是一个非常糟糕的主意。只有超级用户才能创建新数据库,让您的应用程序以超级用户身份连接到数据库是您不应该承担的安全风险。
  • 我在 PostgreSQL JDBC documentation 中没有看到createDatabaseIfNotExist 连接参数,那么你为什么认为存在这样的参数for PostgreSQL? --- 我也没有看到 useUnicodecharacterEncoding。您是否尝试在 PostgreSQL 上使用来自不同数据库的连接参数?连接参数是非常特定于驱动程序的。您不能使用来自不同驱动程序的参数。
  • @a_horse_with_no_name 然而 Hibernate 可以在数据库中创建表吗?它不需要超级用户吗?抛开安全问题不谈,我仍然很好奇如何让它发挥作用。
  • @Andreas 建议在这个:*.com/a/31422939/4759176answer
  • @parsecer “我仍然很好奇如何让它工作” 建议:不要!不适用于 PostgreSQL。手动创建数据库。您仍然可以让程序创建表。

标签: java postgresql hibernate


【解决方案1】:

要手动创建数据库,您可以使用 IDE 或 cmd 来创建数据库

并且要创建表,您可以使用 create 代替 update

 <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">create</property>

它将创建一个模式,然后如果您不想重新创建表,您将在下次启动时使用更新

【讨论】: