我的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客户端尝试过它。)
答案 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>