2016-12-28 76 views
0

我想擴展現有的具有ORM功能的Java工具,並希望將EclipseLink與HSQLDB結合使用。創建連接本身不是問題(它甚至會創建文件系統期望的HSQLDB文件/文件夾結構),但是沒有創建數據庫方案。當使用HSQLDB管理器連接到數據庫時,它只會顯示數據庫屬性,否則它是完全空的。據我可以告訴我採取了所有必要的步驟來創建和初始化數據庫,我將我的代碼與JPA/EclipseLink和幾個stackoverflow帖子上的3個教程進行了比較,但無法找到問題。任何幫助表示讚賞。JPA + EclipseLink + HSQLDB不創建表

這裏是我的相關源代碼:

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:\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 

更新:我能夠縮小問題一點。當我在Start.java中重新排列代碼並創建多個對象時,調用abteilungList.size()它將返回預期結果(創建的對象數)。現在這顯然意味着數據庫連接正常並且正常工作,但是應用程序在退出時會丟棄表。如果我將它配置爲寫入persistence.xml中的內存,這將是HSQLDB的預期行爲,但我選擇寫入文件。讓這個更奇怪的事情是HSQLDB Manager在嘗試訪問數據庫時將返回SQLException,因爲它存在鎖定。這意味着我的HSQLDB實現正在寫入文件系統,而不是內存,並且表應該保留。 HSQLDB默認也是創建MEMORY表,而不是TEMPORARY表(根據http://hsqldb.org/doc/guide/guide.html#sgc_persist_tables),所以也不應該是這個問題。

+0

我不熟悉的HSQLDB及其選項,但如果你沒有在應用程序獲得的例外,它很可能正在創建的表或已經存在,它只是你的檢查或期望的方法是什麼應該存在那個問題。將EclipseLink日誌記錄設置爲最佳狀態以查看運行之間所做的操作,並檢查數據庫文檔以查看是否使用選項來獲得期望的結果。 – Chris

+0

根據HS更新的說明,根據HSQLDB文檔,一切都應該沒有問題(據我所見)。我真的不知道下一步該怎麼做。 – KUSH42

回答

0

問題在於EntityManagerFactory未關閉。很顯然,由於chaching(在這種情況下也使得它不是併發的),HSQLDB在此之前不會將數據保存到磁盤。

factory.close();添加到運行結束之前的代碼將使其寫入腳本文件。

我相信有一些方法來禁用緩存,使其立即寫入到磁盤上,但我沒有打擾任何進一步的調查。

我試過完全相同的代碼使用Apache Derby(更新的pom.xml和persistence.xml中,相同的代碼),它的表現如我所料,在持續的對象,並提交事務寫。