我想将 Hibernate
与 H2
结合使用,并且希望自动创建架构。网上有很多例子,我的配置看起来不错,但没有创建。之前我将它与MySQL
一起使用,没有任何问题。 H2
的任何位置是否需要包含其他参数?
我的持久性单元在 persistence.xml
中定义如下:
<persistence-unit name="some.jpa.name"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- tried with and without class property
<class>some.package.KeywordTask</class>
-->
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:./test" />
<property name="javax.persistence.jdbc.user" value="" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="show_sql" value="true" />
</properties>
</persistence-unit>
由于 show_sql 设置为 true,我希望看到创建语句,但没有任何反应,即未创建架构。
我将 EntityManagerFactory
保留为 final
static
变量:
public static EntityManagerFactory emf = Persistence.createEntityManagerFactory("some.jpa.name");
在我的代码中的某个地方,我试图保留一个实体:
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
KeywordTask task = new KeywordTask();
task.setKeyword(keywordTask.getKey());
task.setLimit(keywordTask.getValue());
em.persist(task);
em.getTransaction().commit();
em.close();
这会引发异常,原因是:
org.h2.jdbc.JdbcSQLException: Table "KEYWORDTASK" not found;
这是预期的,因为架构尚未创建。
如何创建架构?
最佳答案
这个问题的原因完全无关!我写在这里是为了防止其他人也遇到这个问题,并花半天时间做这样的愚蠢的事情。
首先,我从 H2
更改为 Derby
进行检查,结果成功了。这样我就确定了persistence.xml
配置没有问题。
搜索日志后,我意识到 hibernate 无法创建该表,因为 KeywordTask
实体的属性之一是 limit
,而且它是一个保留字! (记住我保存实例的位置并观察 setter 的名称:setLimit
。)更改属性名称后,它起作用了。
关于java - Hibernate - H2 数据库未创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42279617/