2011-12-06 5 views
0

免責事項:私はJava開発に全く新しいです。私は多くのC#といくつかのNHibernateを行ってきましたが、この@Attributesとget/setメソッドの世界は完全に私にとって外国のものです。Hibernateでコレクションプロパティをシリアライズするには?

質問:私は非常に単純な永続オブジェクトを持っている

@Entity 
@Table(name = "ADMIN_SETTINGS") 
public class AdminSettings extends ClientEntity { 
    @Column(name = "SAMPLE_ID_PREFIX") 
    private String sampleIdPrefix; 
    @Column(name = "USE_24_Hr_CLOCK") 
    private Boolean use24hrClock; 

    private Integer[] FieldsForSampleBoxView; 
... 

最後のフィールドは私がして動けなくなることをマッピング。これは、最大で3つの整数の単純なリストです。私は1対多のテーブルは必要ありません。私はそれを集約する必要はありません、私はちょうどdbのフィールドにコレクションをシリアル化する必要があります。理想的には何か人間が読むことができますが、正直なところ、私は気にしません。

これをマッピングするにはどうすればよいですか?

答えて

1

最大で3つの整数が含まれている場合、3つの整数にこれらの3つの整数を格納してみませんか?これは、少なくとも正規化され、照会可能である。

@Column(FIELDS_FOR_SAMPLE_VIEW_BOX) 
private String fieldsForSampleViewBox; 

public void setFieldsForSampleViewBox(Integer[] array) { 
    StringBuilder b = new StringBuilder(); 
    for (int i = 0; i < array.length; i++) { 
     if (array[i] != null) { 
      b.append(array[i]); 
     } 
     if (i < array.length - 1) { 
      b.append(','); 
     } 
    } 
    fieldsForSampleViewBox = b.toString(); 
} 

public Integer getFieldsForSampleViewBox() { 
    if (fieldsForSampleViewBox == null || fieldsForSampleViewBox.length() == 0) { 
     return new Integer[0]; 
    } 
    String[] strings = fieldsForSampleViewBox.split(","); 
    Integer[] result = new Integer(strings.length()); 
    for (int i = 0; i < strings.length(); i++) { 
     if (!strings[i].equals("") { 
      result[i] = Integer.valueOf(strings[i]); 
     } 
    } 
    return result; 
} 

ます。また@Lob注釈や@Type(タイプ= "シリアライザブルを使用することがあります。そうでない場合は、単に永続String属性を使用し、そしてゲッターで、この文字列を解析し、セッターに文字列に変換")アノテーションがInteger配列には存在しますが、ネイティブのJavaシリアル化が使用され、より壊れやすいし、読み込みが不可能になります。

+0

したがって、@Column( "FIELDS_FOR_SAMPLE_VIEW_BOX") 'と' @Type(type = "serializable") 'をInteger []配列に置くだけでうまくいくはずです。正直なところ、このデータが破損してユーザが再選択しなければならない場合はあまり重要ではありません。あなたは@ Lob/@ Typeソリューションの外観を含めてください。ありがとう! –

+0

はい、うまくいくはずです。列はバイナリ列でなければなりません。データが破損していると、ユーザーは何もできなくなります。エンティティがロードされるたびに例外がスローされます。 –

+0

ああ...確かに問題になるでしょう –

0

クレジットは、 "hibernate persist array"について返された最初のリンクgoogleに行きます:thisが必要な場合があります。基本的には、このために独自のシリアライザをHibernateにプラグインする必要があると言います。私はHibernateの専門家ではないので、私は注釈でこれをどのように表現するのか分かりません。

非常に単純ですが、あまりエレガントではありません。int[]を一続きにするのではなく、AdminSettingsの内部にシリアル化された形式のデータを保持します。たとえば、カスタムデリミタ(ugh)を含む文字列です。あるいは、int[]とシリアライズされた形式の両方を持つこともできますが、それらの間の一貫性をサポートするにはより多くのメモリとCPUが必要になります。

+0

ええ、それは私が求めているものです。私はこれまでNHibernateでこれを行ってきましたが、ここでどのように表現するかは考えていません。また、整数配列を扱える標準のシリアライザがあることを願っています。 –

関連する問題