Java 为什么h2数据库驱动程序(JPA)不创建表,而postgres创建表

Java 为什么h2数据库驱动程序(JPA)不创建表,而postgres创建表,java,sql,postgresql,jpa,h2,Java,Sql,Postgresql,Jpa,H2,在JPA项目中,当使用postgresql驱动程序时,表是自动生成的。当我切换到h2数据库驱动程序时,会出现错误,即找不到表。这让我假设,没有生成表 Postgresql配置 <persistence-unit name="postgresql" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

在JPA项目中,当使用postgresql驱动程序时,表是自动生成的。当我切换到h2数据库驱动程序时,会出现错误,即找不到表。这让我假设,没有生成表

Postgresql配置

<persistence-unit name="postgresql" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>...</class>
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1/example"/>
        <property name="javax.persistence.jdbc.password" value="example"/>
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
        <property name="javax.persistence.jdbc.user" value="example"/>
        <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
    </properties>
</persistence-unit>
<persistence-unit name="OntoJobTestDB" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>...</class>    
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
        <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
        <property name="eclipselink.ddl-generation.output-mode" value="database" />
    </properties>
</persistence-unit>

org.eclipse.persistence.jpa.PersistenceProvider
...
h2配置

<persistence-unit name="postgresql" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>...</class>
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1/example"/>
        <property name="javax.persistence.jdbc.password" value="example"/>
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
        <property name="javax.persistence.jdbc.user" value="example"/>
        <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
    </properties>
</persistence-unit>
<persistence-unit name="OntoJobTestDB" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>...</class>    
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
        <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
        <property name="eclipselink.ddl-generation.output-mode" value="database" />
    </properties>
</persistence-unit>

org.eclipse.persistence.jpa.PersistenceProvider
...    

结果是,这些表无法找到,因为它们从未被创建过。由特定于postgresql的
@Converter
注释引起的早期错误阻止了表的创建


我的建议是始终仔细检查调试输出。

您已经对H2使用了内存模式(
jdbc:H2:mem:test
)。如果数据库存储到磁盘上(例如
jdbc:h2:~/data/test
),它能工作吗?@ThomasMueller不,我尝试过这个,但我得到了相同的错误。我发现了真正的问题,请看下面我自己的答案。谢谢!很高兴知道!非常感谢。建议起来很容易。但它适用于所有情况!我发现通过日志重新定义了配置:)