2011-11-12 12 views
5

私はオブジェクトを永続化しようとしていますが、これまでの非常に最小限のプロジェクトmaven/jpa/hibernateプロジェクトを設定しました。EntityManagerはデータベースに書き込みません

私のクラスは非常に単純なものである:

@Entity 
public class Person { 
    @Id @GeneratedValue 
    private int id; 
    private String name; 
} 

私のpersistence.xmlが同様に非常に基本的なものです:

<persistence xmlns="http://java.sun.com/xml/ns/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"> 
    <persistence-unit name="Fahrplan_v2"> 
     <class>model.Person</class> 
     <properties> 
      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" /> 
      <property name="hibernate.connection.url" value="jdbc:hsqldb:file:data/db/db" /> 
      <property name="hibernate.connection.username" value="sa" /> 
      <property name="hibernate.connection.password" value="" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

そして最後に、ここで私は、オブジェクトを永続化するために使用したコードです:

EntityManager em = entityManagerFactory.createEntityManager(); 
em.getTransaction().begin(); 
em.persist(person); 
// em.flush(); <- does not effect outcome. 
em.getTransaction().commit(); 
em.close(); 

ここで起こることが期待される2つのことがあります。まず、私はPersonテーブルがcr eated(hibernate.hbm2ddl.auto = updateのため)。これは一度起こって、それは正しく書いた

CREATE MEMORY TABLE PUBLIC.PERSON(
    ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, 
    NAME VARCHAR(255) 
) 

私はまったくそれを再現することはできません。プログラムを起動するたびに、hsqldbデータベースファイルが作成されますが、テーブルは作成されません。

第2に、永続オブジェクトがデータベースに格納されると期待しますが、そうではありません。また、手動でデータベーススキーマを作成しても問題は解決しないので、それが原因ではありません。永続化されたコードは例外なく出力されます。しかし、オブジェクトはデータベースに届きません。オブジェクトは、「from Person」を使用してエンティティマネージャに照会するときにも見つかりません。

しかし、クエリが機能するのは唯一の問題です。私は手動でデータムをデータベースに挿入することができ、 "from Person"クエリはそれを正常に取得します。

ここで間違っていることに関するヒントはありますか?

+1

ハムは大丈夫、私はコメントとしてこれを投稿します(まだ?): を私は私の問題を発見しました。 em.getTransaction()。commit(); Thread.sleep(1000); em.close(); はそのトリックをしました。 私のテストケースの後、JVMは非常に速くシャットダウンし、hsqldbはコミットされたデータをディスクに永続させるのに十分な時間がありませんでした。 JVMが生きていない理由、System.exit()呼び出しなど何もしない理由を聞かないでください。私のjunitテストメソッドは単にそこで終わります。何らかの理由で、JVMは、私のオブジェクトを永続させるべき別のスレッドであると仮定しても、生きていません。 – MisterD

+0

あなたはあなたの質問に答えることができますが、そうすることが奨励されています。 FAQを読んでください。あなたの質問は良いので、誰もが恩恵を受けるように答えを要約してください。 – Siddharth

答えて

5

あなたのスリープ(1000)がどのように働いたか:絶対に同期持続性が必要な開発状況では、デフォルトのwrite_delayをオフにします。

<property name="hibernate.connection.url" 
     value="jdbc:hsqldb:file:data/db/db;shutdown=true;hsqldb.write_delay_millis=0"/>    

これは、結果が呼び出し元に返される前にすべての文がディスクに書き込まれることを意味します。もちろん、通常の操作では、この値を大きくすることができます。デフォルトは500msで、スリープ(1000)が必要です。指定された情報は、HSQLDBバージョン2.2.x用です。

3

あなたは、データベースのURLにshutdown=trueを追加(または明示的なSHUTDOWNコマンドを発行)を正しく処理中のHSQLDBデータベースをシャットダウンするためにする必要があります。

<property name="hibernate.connection.url" 
    value="jdbc:hsqldb:file:data/db/db;shutdown=true" />    

も参照してください:

+0

ああ、言いたいことを忘れてしまった、私は早くそれを持っていたし、それを削除した。それの有無にかかわらず動作しません。 :( – MisterD

0

これは誰かを助けることを望みます。書き込み遅延を0msに設定することを推奨しますが、新しいdbを作成しない限り、URLからは機能しません。データベースに接続し、以下のSQL文を使用している間、それが適用させるには、スクリプトでそれを実行します。

set files write delay false 

したがって、たとえば、あなたがsqltoolを使用してそれを実行することができます。そのようにjarファイル:私は自分の質問に答えることを許可されていないよので

java -jar /path/to/sqltool.jar -sql "set files write delay false;" --inlinerc=<rc spec here> 
関連する問題