gpt4 book ai didi

java - Hibernate - H2 数据库未创建

转载 作者:行者123 更新时间:2023-11-30 06:53:25 25 4
gpt4 key购买 nike

我想将 HibernateH2 结合使用,并且希望自动创建架构。网上有很多例子,我的配置看起来不错,但没有创建。之前我将它与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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com