找不到H2

时间:2018-01-10 20:06:57

标签: jpa wildfly h2

我的Java EE应用程序找不到表。我使用WildFly(作为应用程序服务器)和H2(作为DB,在嵌入模式下)。

错误是:

org.h2.jdbc.JdbcSQLException: Table "MY_TABLE" not found

看看我的表创建:

create table "MY_TABLE" (
    -- ...
);

了解我的实体是如何定义的:

@Entity
@Table(name = "MY_TABLE")
public class MyTable {
    // ...
}

这就是我调用JPA的方式(这会导致异常):

@PersistenceContext
private EntityManager entityManager;

// ...

entityManager.find(MyTable.class, 1);

我的 persistence.xml 是:

<persistence-unit name="myapp" transaction-type="JTA">
    <jta-data-source>java:jboss/datasources/myappDS</jta-data-source>
</persistence-unit>

我的WildFly中的 standalone.xml

<datasource jndi-name="java:jboss/datasources/myappDS" pool-name="myappDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:h2:~/myapp;SCHEMA=PUBLIC</connection-url>
    <driver>h2</driver>
</datasource>
<drivers>
    <driver name="h2" module="com.h2database.h2">
        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
    </driver>
</drivers>

一切看起来都不错,为什么例外呢?我需要冲洗一些东西吗?或者在某处设置架构?

如果我在WildFly中配置另一个数据源(具有相同的数据库结构)(例如Postgres),一切正常。这意味着数据源配置是导致错误的地方。

(是的,我完全确定数据库不是空的,并且连接URL是正确的,因为我从SQL客户端尝试过它。)

2 个答案:

答案 0 :(得分:0)

您是否以不同于测试连接的用户身份运行应用程序?在这种情况下,连接路径中的~将解析为不同的主文件夹,从而解析为不同的数据库。

否则我建议在h2 jar文件中连接Shell并运行show tables以验证表是否存在并且具有正确的大小写。运行以下命令启动shell:

java -cp h2*.jar org.h2.tools.Shell

答案 1 :(得分:0)

您在哪里存储脚本以创建表格?它是在应用程序的类路径中吗?

在我的测试设置中,我让hibernate在启动时生成表(并在关闭时删除它)并使用import.sql脚本生成测试数据,该脚本位于文件夹src/main/resources中。 / p>

<persistence-unit name="myapp" transaction-type="JTA">
  <jta-data-source>java:jboss/datasources/myappDS</jta-data-source>
  <properties>
    <property name="hibernate.hbm2ddl.auto" value="create-drop" />
  </properties>
</persistence-unit>