【发布时间】:2020-04-12 03:56:17
【问题描述】:
我有几个针对应用程序 JPA 层的单元测试。该 JPA 层包含 JPA 实体和提供持久化实体所需的基本 API 的服务。单元 tets 直接使用 javax.persistence 类来处理 PersistenceManager。然后它测试持久化 API,我可以在日志中看到用于创建表和序列等的 SQL 语句。
persistence.xml 文件的相关部分如下所示:
<persistence-unit name="..." transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
...
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test"/>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
...
我已经下载了 Windows 安装程序 H2 1.4.200,并将其安装在 Windows 10 上。现在我想使用 H2 控制台连接到数据库并检查由 Hibernate 自动创建的表、序列等.
所以,转到http://localhost:8082 我得到以下信息:
但是当我尝试使用定义的 JDBC 连接字符串连接到我的数据库时,我得到以下信息:
我在这里做错了什么?
非常感谢。
尼古拉斯
【问题讨论】:
-
您必须在应用程序中运行 H2 控制台。您现在正在做的是单独运行 H2;该单独的 H2 服务器无法查看应用程序内部的嵌入式 H2 数据库。
-
见this。对于您的设置,
hibernate.hbm2ddl.auto=create-drop数据库将在断开连接后被删除。 -
@Jesper:“从应用程序中运行 H2 控制台”是什么意思? H2 控制台是一个 webapp,而我的用例需要检查 Hibernate 在单元测试中自动创建的 SQL 对象。
-
@SternK:我知道,这是故意的。尝试连接到数据库时,会话处于活动状态。无论如何,用 create 替换 create-drop 不会改变任何事情。
-
是的,您需要在您的应用程序中运行一个 Web 服务器,该服务器将为 H2 控制台提供服务。你如何做到这一点取决于你的应用程序;如果它是 Spring Boot 应用程序,那么就像在
application.properties中设置spring.h2.console.enabled=true一样简单。