2016-12-28 11 views
0

ORM機能を備えた既存のJavaツールを拡張しようとしており、HSQLDBと組み合わせてEclipseLinkを使用したいと考えています。接続自体を作成することは問題ではありません(ファイルシステムで期待されるHSQLDBファイル/フォルダ構造を作成することさえあります)。ただし、データベーススキームは作成されません。 HSQLDBマネージャを使用してデータベースに接続すると、データベースのプロパティのみが表示されます。それ以外の場合は完全に空です。私がデータベースを作成して初期化するために必要なすべてのステップを踏んだとすれば、コードをJPA/EclipseLinkといくつかのスタックオーバーフローポストに関する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がロックされているため、データベースにアクセスしようとしているときにHSQLDB ManagerがSQLExceptionを返すということです。つまり、私のHSQLDB実装はメモリではなくファイルシステムに書き込んでおり、テーブルは永続化する必要があります。 HSQLDBのデフォルトでは、TEMPORARYテーブル(http://hsqldb.org/doc/guide/guide.html#sgc_persist_tablesによる)ではなく、MEMORYテーブルを作成することもできます。

+0

私はHSQLDBとそのオプションに精通していませんが、アプリケーションで例外が発生していない場合は、テーブルが作成されているか、既に存在している可能性があります。それが問題になるはずです。実行の間に何が行われているかを見るには、EclipseLinkのロギングを最善に設定し、データベース・ドキュメントをチェックして、オプションを使用して期待どおりの結果を得るかどうかを確認します。 – Chris

+0

HSQLDBの文書によると、OPのアップデートで説明したように、すべてがうまくいくはずです(私が見る限り)。私は正直なところで何をすべきか分かりません。 – KUSH42

答えて

0

問題は、EntityManagerFactoryが閉じられていないことでした。どうやら、HSQLDBは​​チャンクのためにその前にディスクにデータを保持していません(この場合、これは非同期になります)。

ランタイム終了前に factory.close();をコードに追加すると、スクリプトファイルに書き込まれます。

キャッシングを無効にしてすぐにディスクに書き込む方法があると確信していますが、それ以上は気にしません。

私は、Apache Derby(更新されたpom.xmlとpersistence.xml、同じコード)と全く同じコードを試して、期待どおりにオブジェクトを永続化し、トランザクションをコミットするように書きました。

関連する問題