2016-04-09 3 views
0

固定の定数セットを持つInkクラスがあります。彼らは変わることはなく、私はこのクラスをテーブルとして保存したくありません。Hibernate:テーブルを持たないフィールドでクラスをロードする

public final class Ink { 
    public static final Ink Y = new Ink(91001, 'y', 90.70, -5.23, 94.37), "Yellow"); 
    public static final Ink M = new Ink(92001, 'm', 48.19, 72.01, -1.78), "Magenta"); 
    public static final Ink C = new Ink(93001, 'c', 56.46, -41.00, -43.50), "Cyan"); 
    public static final Ink K = new Ink(94001, 'k', 18.64, 1.80, 5.21), "Black");  

    public int code; 

    public static Ink forCode(int code) { 
     //... 
    } 

    //... 
} 

他のクラスは、Ink ink又はCollection<Ink> inksフィールドを有することができるが、すべてのinkインスタンスは、そのcode値の単純な整数列としてマッピングされなければなりません。 Codeは、外部キーなどではありません。それは、いつでもInkインスタンスを取得できる単純な整数値です。

@Entity 
public class Order { 
    //... 
    @OneToMany  
    public Set<Ink> inks; 
    //... 
} 

私はそのcodeとバック

@Converter(autoApply = true) 
public class InkConverter implements AttributeConverter<Ink, Integer> { 

    @Overrcodee 
    public Integer convertToDatabaseColumn(Ink ink) { 
     return ink.code; 
    } 

    @Overrcodee 
    public Ink convertToEntityAttribute(Integer code) { 
     return Ink.forCode(code); 
    } 
} 

Inkクラスを復元​​するために、コンバータを使用することができますが、質問です:まだテーブルとしてクラスをマッピングから休止状態を防ぐ方法

code列からクラスフィールドを読み込みましたか?

+0

を追加準拠しているJPAの実装はそれを行いません。 –

答えて

1

Javaコードにインクを保存するとき。だからあなたは自分でロードアクションを実装するべきです。まず、@Transientアノテーションを使ってHibernateがクラスとしてテーブルをマッピングするのを防ぐことができます。ロードされた注文は、ロードされた後に処理できます。

public interface Inked { 
    getCode(); 
    setInk(Ink ink); 
} 

public abstract class AbstractEntity { 

    @PostLoad 
    public void loadInk() { 
     if(this instanceof Inked){ 
      Inked inked = (Inked) this; 
      inked.setInk(Ink.forCode(getCode())); 
     } 
    } 
} 

@Entity 
public class Order extends AbstractEntity implement Inked { 
    //... 
    public Integer code; 

    @Transient 
    public Ink ink; 
    //... 

} 
+0

良いですが、この場合、 'Ink'フィールドを持つすべてのエンティティに' loadInk() 'と' code'を付ける必要があります。 –

+0

あなたはインクを持っている多くのエンティティがある場合。あなたはそれがインターフェイスを使用することがあります。コードが更新されました。 – xierui

1

まず、インクのインスタンスを表すために列挙型を作成することができます。コードではなく、char参照(Y、M、C、K)を格納するように列を変更できる場合は、これが最も簡単な解決方法です。そうでなければ、コードからEnumインスタンスに変換するように提案したように、コンバータを使用することができます。

public Enum Ink { 
    Y = new Ink(91001, 'y', 90.70, -5.23, 94.37), "Yellow"); 
    M = new Ink(92001, 'm', 48.19, 72.01, -1.78), "Magenta"); 
    C = new Ink(93001, 'c', 56.46, -41.00, -43.50), "Cyan"); 
    K = new Ink(94001, 'k', 18.64, 1.80, 5.21), "Black"); 

    .....  

    private static Ink (...) { 
     ... 
    } 
} 

Y、M、C、Kを保存すると、マッピングは以下のようになります。あなたは、コードを保存する必要がある場合、それは@Entityアノテーションを持っていないのに、なぜテーブルとしてマップ__Ink__休止状態でしょうか?必要なコンバータ(http://www.nurkiewicz.com/2013/06/mapping-enums-done-right-with-convert.html

@Entity 
public class Order { 

    @ElementCollection 
    @CollectionTable(...) 
    @Enumerated(EnumType.STRING) 
    public Set<Ink> inks; 

    @Enumerated(EnumType.STRING) 
    private Ink ink; 
} 
関連する問題