2010-11-18 11 views
5

java.util.Propertiesオブジェクトを持つオブジェクトを永続化するにはどうすればよいですか?Hibernateでjava.util.Propertiesを永続化しますか?

java.util.Propertiesオブジェクトは、プロパティ自体を検索する機能だけでなく、デフォルトのプロパティリストも参照できることに注意してください。デフォルトのプロパティリスト自体は別のPropertiesオブジェクトなので、別のデフォルトプロパティリストを持つこともできます。 1つのプロパティを検索すると、そのプロパティが見つかる前に複数のPropertiesオブジェクトを走査できます。

Propertiesのような階層的なオーバーライド可能なプロパティが必要なため、私自身のデータ構造を実装する代わりにPropertiesを使用することを考えていました。しかし、私はそれをどのように維持するのか混乱しています。

  • カスタムUserTypeを作成する必要がありますか?どのようにこの状況のた​​めにこれを行う上の任意のポインター?
  • Hibernateでプロパティを永続化する方法を示すハウツーまたは他のリソースを知っている人は誰ですか?

答えて

3

最初の質問は、階層メタデータを保存する必要があるのか​​、すべてのプロパティを保存するだけなのかです。大文字小文字の場合は、末尾にすべてのプロパティ(getPropertyNames()を使用)を追加するだけです(持続的なマップはほとんどありません)

階層を保持したい場合は、これはデータベースに表されます。 - 私はすぐに考えることはできません

id | key | value | properties_set_id | parent_properties_set_id 

しかし、どのようにそれを行うには:

私が想像する最も簡単な方法は、次の列で一つのテーブルを持つことです。おそらくはSet<PropertyEntry>を維持するでしょう。

+0

Bozho、私はあなたがプロパティのインスタンスを一時的にするだろうと仮定しますが、どの時点でプロパティをマップにエクスポートしますか?私はそれがいつ起こるかの仕組みが分からない。 –

+0

@Jason Nichols私はそれを手作業のプロセスとして意味しました。あるいは '@ PreX'イベントリスナーでしょう。おそらくそれはUserTypeを介して可能ですが、私はそのようなことは一度も書いていないので、わかりません。 – Bozho

4

「断片」の場合は分かりませんが、PropertiesインスタンスからXMLを保存してXMLからインスタンスをロードできるので、XMLを保持しているエンティティに@Lobプロパティを持たせることができます永続する。 ような何か:

class MyEntity implements Serializable { 
    @Transient 
    Properties props; 

    @Lob 
    byte[] xmlProp; //the xml as a byte[] 

    //ids, getters & setters ommited 

} 

そして、あなたはあなたのエンティティを永続化および取得のハードワークを行うにDAO実装することができます:java.util.Properties APIで

class MyEntityDAO { 

    public void persist(MyEntity entity){ 

    try { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     entity.getProps().storeToXML(bos, "a simple comment if you like"); 

     byte[] byteStream = bos.toByteArray(); 
       entity.setXmlProp = byteStream; 

       //save your instance with hibernate... 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    public MyEntity retrieveById(Long id){ 

     Properties propFromDB = new Properties(); 

     MyEntity ent = //retrieve the instance with hibernate... 

     try{ 
     Properties propFromDB = new Properties(); 
     ByteArrayInputStream bais = new ByteArrayInputStream(ent.getXmlProp()); 
     propFromDB.load(bais); 
     ent.setProp(propFromDB); 
     return ent; 
     } catch (IOException ioe){ 
     ioe.printStackTrace(); 
     } 
     return null; 
    } 
} 

チェック方法storeToXMLとloadFromXMLを。

希望します。

+0

非常に面白いルーカス。私がこのメソッドで持つ唯一の問題は、プロパティのキーと値のペアに基づいて検索することができなくなることです。あなたはその周りに何らかの方法を知っていますか? –

+0

xmlPropをbyte []からStringに切り替え、ByteArray *の内容でStringを入力し、そのプロパティでxml自体を保持することができます。それはあなたにデータを照会する可能性を与えますが、ハッキーのように見えます。どのような種類のクエリを実行しようとしていますか? –

関連する問題