2011-08-03 4 views
0

私は、Hibernateを使用してJava EEアプリケーションのグローバルデータを格納する最適なソリューションを探しています。これはキーの値のペアで構成されます。例:Hibernateを使用してJ2EEアプリケーションにグローバルデータを格納するためのベストプラクティス

projectStarted = "10-11-11" 
developerNumber = 3 
teamLeader = "John" 

ご覧のとおり、これらのすべてのエントリには異なる種類があります。今私は2つのオプションを参照してください

1)は、グローバルデータエンティティを作成します。テーブルの各フィールドは一意の列として表示され、固有の設定が含まれます。この方法では型キャストに問題はありませんが、設定が大量になる場合は避けたいと思います。

2)設定エンティティを作成します。それぞれには、キー(プライマリキー)と値という2つのフィールドがあり、テーブル内で一意のレコードとして表されます。これは望ましい解決策ですが、設定はどのようなタイプでもよいので、私は多くの型キャストを得ることができます。

基本的に、私はさまざまなタイプから多くの問題を抱くことなく、第2のソリューションを実装する方法を探しています。誰か助けてくれますか?

ありがとうございました。

編集1.

うん、ありがとうクリスチャン。ちょうど似たような考えがあります

私は次のようになります設定エンティティ、必要があります場合はどう:

@Entity 
@Table(name = "settings") 
public class Setting { 

    @Column 
    private String key; 
    @Column 
    private String value; 
    @Column 
    private String converterClassFullName; //example by.lugovsky.MyConverter 

    //Getters, setters 
} 

そして、グローバルデータクラスを。

public class GlobalData { 
    private Date projectStarted; 

    private int developerNumber; 

    private String teamLeader; 

    Set<Setting> settings; 

    //Getters and setters for all, except settings. 

} 

だから、基本的に私の考えは、私は私のDAOでこれを行うことができます永続化/更新/などの前にエンティティを設定する変換することですが、私は作成せずに、同様@Entityアノテーションでグローバルデータクラスに注釈を付けることができれば、私は、思っていました新しいテーブル。このようにして、OneToManyアノテーションをSettingのセットに設定し、内部の@PrePersistなどのメソッドでコンバージョンを実行できます。

Hibernateは私にこれを許可しますか?

おかげで再び

+0

プロパティファイルに非常に簡単に保存できるもののようです。型安全なアクセスのためにBeanをラップすることもできます。拡張が容易で、更新が容易です。 – Caps

+0

もちろん、問題は、これらの値を変更するためのGUIを提供する必要があることです。だから私はむしろDBにこれを格納します。 –

答えて

1

あなたはデシベルに変換クラスを格納することができ、それが値を使用する前に、プロパティのために与えられたコンバータを介して実行してみましょう。 JSFは、コンバータのAPIを提供しています:

public interface Converter{ 
    public Object getAsObject(FacesContext fc, UIComponent component, String value) throws ConverterException; 

    public String getAsString(FacesContext fc, UIComponent component, Object obj) throws ConverterException; 
} 

あなたは

名前のスキーマがある場合:文字列を

値:文字列

コンバータ:クラス

あなたはこのような何かを行うことができます:

PropertyEntry pe = // Get from OR-Mapper 
Converter c = (Converter) pe.getConverter().newInstance(); 
Object o = c.getAsObject(null, null, pe.getValue()); 
// use the object o instead of value 

さらに涼しさのために、オブジェクト内で変換された値を保持するために使用できる永続化されないクラス内のフィールドを定義することもできます。

+0

あなたの答えをありがとう、私の編集を参照してください。 –

+0

それがうまくいくかどうか確かめることはできませんが、そうは思わないでしょう。あなたは本当にそれを試してみる必要がありますが、これは十分柔軟ではありませんか?そのような一般的なアプローチを強化しようとしないでください、彼らはすぐに非常にトリッキーになるでしょう。あなたがそれを試したときに私に教えてください! –

+0

私はそれを最後に試しました。しかし、私はHibernateが余分なテーブルを作成せずにこれを処理できるように管理していませんでした。だから私はDaoで必要な変換をすべて実行していると思っています。 Daoは変換ロジックをカプセル化し、サービスレベルではその生成方法を知らなくてもGlobalDataインスタンスで作業できます。私はグローバルデータクラスのフィールドにアクセスし変換するためにリフレクションを使用しています。このようにして、GlobalDataに新しいフィールドを追加するだけでデータベースに新しいレコードを追加できます。フィールドを削除すると、DBからレコードも削除されます。私はあなたの助けに感謝します、ありがとう。 –

関連する問題