Java JPA&x2B;日食线+;HSQLDB不创建表

Java JPA&x2B;日食线+;HSQLDB不创建表,java,jpa,eclipselink,hsqldb,Java,Jpa,Eclipselink,Hsqldb,我试图用ORM功能扩展现有的Java工具,并希望将EclipseLink与HSQLDB结合使用。创建连接本身不是问题(它甚至会在文件系统上创建您期望的HSQLDB文件/文件夹结构),但是没有创建任何数据库方案。当使用HSQLDB管理器连接到数据库时,它将只显示数据库属性,否则将完全为空。据我所知,我已经采取了所有必要的步骤来创建和初始化数据库,我将我的代码与JPA/EclipseLink上的3个教程和几个stackoverflow帖子进行了比较,但没有找到问题所在。感谢您的帮助 以下是我的相关源

我试图用ORM功能扩展现有的Java工具,并希望将EclipseLink与HSQLDB结合使用。创建连接本身不是问题(它甚至会在文件系统上创建您期望的HSQLDB文件/文件夹结构),但是没有创建任何数据库方案。当使用HSQLDB管理器连接到数据库时,它将只显示数据库属性,否则将完全为空。据我所知,我已经采取了所有必要的步骤来创建和初始化数据库,我将我的代码与JPA/EclipseLink上的3个教程和几个stackoverflow帖子进行了比较,但没有找到问题所在。感谢您的帮助

以下是我的相关源代码:

Start.java:

package start;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import DBmodel.Abteilung;

public class Start {

    private Start() {
    }

    private static final String PERSISTENCE_UNIT_NAME = "LNDB";
    private static EntityManagerFactory factory;

    public static void main(String[] args) {

        factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = factory.createEntityManager();

        Query q = em.createQuery("select a from Abteilung a");
        List<Abteilung> abteilungList = q.getResultList();
        for (Abteilung abt : abteilungList) {
            System.out.println(abt);
        }

        System.out.println("Elements: " + abteilungList.size());
        em.getTransaction().begin();
        Abteilung abt = new Abteilung();
        abt.setName("test1");
        em.persist(abt);
        em.getTransaction().commit();

        em.close();
    }
}
persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
        <persistence-unit name="LNDB" transaction-type="RESOURCE_LOCAL">
           <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
                <class>DBmodel.Abteilung</class>
 <properties>
  <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
  <property name="javax.persistence.jdbc.url"
        value="jdbc:hsqldb:file:C:\tmpD\LN" />
  <property name="javax.persistence.jdbc.user" value="sa" />
  <property name="javax.persistence.jdbc.password" value="" />

  <!-- EclipseLink should create the database schema automatically -->
  <property name="eclipselink.target-database" value="hsql"/>
  <property name="eclipselink.ddl-generation" value="create-tables" />
  <property name="eclipselink.ddl-generation-mode" value="ddl_database_generation" />
  <property name="eclipselink.ddl-generation.output-mode" value="database" />
 </properties>

        </persistence-unit>
</persistence>

更新:我能够缩小问题的范围。当我重新排列Start.java中的代码并创建多个对象时,调用abteilungList.size()将返回预期结果(创建的对象数)。现在,这显然意味着数据库连接良好且正常工作,但应用程序在退出时正在删除表。如果我将HSQLDB配置为写入persistence.xml中的内存,这将是HSQLDB的预期行为,但是我选择了写入文件。更奇怪的是,HSQLDB管理器在尝试访问数据库时会返回一个SQLException,因为数据库上有一个锁。这意味着我的HSQLDB实现正在写入文件系统,而不是内存,表应该持久化。HSQLDB的默认设置也是创建内存表,而不是临时表(根据),因此这也不应该成为问题。

问题在于未关闭
EntityManagerFactory
。显然,HSQLDB在此之前不会将数据持久化到磁盘,这是由于切换(这也使得它在本例中是非并发的)

添加
factory.close()在运行时结束前写入代码将使其写入脚本文件

我确信有某种方法可以禁用缓存并使其立即写入磁盘,但我没有费心进一步研究它


我在Apache Derby上尝试了完全相同的代码(更新了pom.xml和persistence.xml,代码相同),它的行为与我预期的一样,编写持久化对象并提交事务。

我不熟悉HSQLDB及其选项,但如果应用程序中没有出现异常,这些表似乎正在创建或已经存在,而问题在于您检查或期望应该存在什么的方法。将EclipseLink logging设置为finest以查看在运行之间所做的操作,并检查数据库文档以查看是否使用这些选项来获得预期的结果。根据HSQLDB文档,一切都应该正常(据我所知),如OP更新中所述。我真的不知道下一步该怎么办。
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
        <persistence-unit name="LNDB" transaction-type="RESOURCE_LOCAL">
           <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
                <class>DBmodel.Abteilung</class>
 <properties>
  <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
  <property name="javax.persistence.jdbc.url"
        value="jdbc:hsqldb:file:C:\tmpD\LN" />
  <property name="javax.persistence.jdbc.user" value="sa" />
  <property name="javax.persistence.jdbc.password" value="" />

  <!-- EclipseLink should create the database schema automatically -->
  <property name="eclipselink.target-database" value="hsql"/>
  <property name="eclipselink.ddl-generation" value="create-tables" />
  <property name="eclipselink.ddl-generation-mode" value="ddl_database_generation" />
  <property name="eclipselink.ddl-generation.output-mode" value="database" />
 </properties>

        </persistence-unit>
</persistence>
[EL Info]: 2016-12-28 15:33:11.299--ServerSession(375741537)--EclipseLink, version: Eclipse Persistence Services - 2.3.2.v20111125-r10461
[EL Info]: 2016-12-28 15:33:18.79--ServerSession(375741537)--file:/C:/LN_Erfassung/target/classes/_LNDB login successful
Elements: 0