JPA Eclipselink HSQLDB不会创建表



我正在尝试扩展具有ORM功能的现有Java工具,并希望与HSQLDB结合使用Eclipselink。创建连接本身并不是问题(它甚至创建了您在文件系统上期望的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();
    }
}

abteilung.java:

package DBmodel;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "ABTEILUNG")
public class Abteilung {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private int id;
    @Column(name = "Name")
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

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:tmpDLN" />
  <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

更新:我能够稍微缩小问题。当我在start.java中重新排列代码并创建多个对象时,请致电abteilunglist.size(),它将返回预期的结果(创建的对象数)。现在,这显然意味着数据库连接很好并且可以正常工作,但是该应用程序在退出时会丢弃表。如果我将其配置为在persistence.xml中写入内存,则可以预期HSQLDB的行为,但是我选择写入文件。使这一点甚至奇怪的事情是,HSQLDB Manager在尝试访问数据库时会返回SQLEXCEPTION,因为它上面有锁定。这意味着我的HSQLDB实现将写入文件系统而不是内存,并且表应该持续存在。HSQLDB默认值也是创建内存表,而不是临时表(根据http://hsqldb.org/doc/guide/guide/guide.html#sgc_persist_tables_tables),因此这也不应该是问题。

问题是EntityManagerFactory没有关闭。显然,HSQLDB在此之前并不持续到数据磁盘(在这种情况下这也使其不连续)。

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

我敢肯定,有某种方法可以禁用缓存并立即将其写入磁盘,但是我不愿意进一步研究它。

我尝试了Apache derby完全相同的代码(更新Pom.xml and Persistence.xml,相同的代码),并且它的行为是我所期望的,写在持久对象并进行交易时。

最新更新