我应该检查服务器启动时是否存在表。如果它们不存在,我必须使用实体类创建它们。这甚至可能吗? 我正在使用Eclipse,我的服务器是wildfly10。我正在连接到Oracle 11g xe,但我认为它不是导致问题的数据库
无论如何,这是我到目前为止所做的事情
我的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="Lab5">
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
</properties>
</persistence-unit>
</persistence>
如果没有上述属性,我的数据库查询将抛出异常。但真正奇怪的是,使用此属性查询返回空列表,但数据库中不存在表。 此外,我注意到服务器启动时出现警告
HHH000431: Unable to determine H2 database version, certain features may not work
我尝试了在stackoverflow和其他网站上发现的此警告的各种修复程序,但它们没有帮助。我甚至不知道这是否与我的问题有关
答案 0 :(得分:2)
这可能取决于您在项目中的实施情况。假设您正在使用hibernate进行持久化,那么您需要添加以下内容:
...
<persistence-unit ...>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
...
<properties>
<property name = "hibernate.hbm2ddl.auto" value="create" />
...
</properties>
</persistence-unit>
请注意,这将假定您的连接是由在db创建表中具有所需权限的用户形成的。看看hibernate docs here。
答案 1 :(得分:2)
JPA 2.1使DDL生成成为规范的一部分。您可以将“javax.persistence.schema-generation.database.action”持久性属性与“create”值一起使用,以使2.1提供程序在部署期间为您创建数据库架构。如果您需要修改表创建/拆除和填充过程,JPA可用于生成甚至运行自定义脚本。
您可能遇到的问题是您的持久性单元未指定数据源,将其留在容器中以确定要连接的数据源,并且Wildfly必须默认为H2数据库。这些表将在此数据库中设置,但不是您期望的Oracle XE数据库 - 这就是为什么查询不返回任何值,而在控制台中,表甚至不存在。
您需要在服务器中为数据库设置数据源,然后使用<non-jta-data-source>
或<jta-data-source>
将持久性单元指向它。你的persistence.xml不完整,所以我建议你先看看一个演示持久性单元。