2012-04-10 1 views
0

は...次JPA:派生クラスを独自のテーブルに保存して、参照されるフィールドがMappedSuperclassですか?

を行うには、それは可能です私はMappedSuperclassアクションと呼ばれるがあります。また、私は2クラス(エンティティ)を持っている

@MappedSuperclass 
public class Action extends EntityBase 
{ 
    private static final long serialVersionUID = 2604473746836781718L; 

    private String event; 

    public String getEvent() 
    { 
     return event; 
    } 

    public void setEvent(String event) 
    { 
     this.event = event; 
    } 
} 

例GenericActionのために、このクラスから派生:

@Entity 
@Table(name = "JOURNAL") 
@AttributeOverrides({@AttributeOverride(name = "id", column = @Column(name = "JRN_ID")), 
     @AttributeOverride(name = "version", column = @Column(name = "JRN_VERSION"))}) 
public class Journal extends EntityBase 
{ 
    private static final long serialVersionUID = 2525323851057436815L; 

    @Column(name = "JRN_ACTION") 
    private Action action; 
} 
:ジャーナルと呼ばれる別のエンティティで
@Entity 
@Table(name = "GENERIC_ACTION") 
@AttributeOverrides({@AttributeOverride(name = "id", column = @Column(name = "GAC_ID")), 
     @AttributeOverride(name = "version", column = @Column(name = "GAC_VERSION")), @AttributeOverride(name = "event", column = @Column(name = "GAC_EVENT"))}) 
public class GenericAction extends Action 
{ 
    private static final long serialVersionUID = 2694061082912048881L; 

    @Column(name = "GAC_PAYLOAD") 
    private String payload; 

    public String getPayload() 
    { 
     return payload; 
    } 

    public void setPayload(String payload) 
    { 
     this.payload = payload; 
    } 
} 

設定されたこのアクション属性があります

私のコードでは、インスタンスGenericActionをインスタンス化し、Journalのセッターで設定します。ジャーナルを永続化するときは、GenericActionの内容を独自のテーブルに保存する必要がありますが、これは起こりません。 GenericActionのバイトコードをJournalのActionフィールドに保存します。

これはまったく可能ですか?私はあなたの質問を得た場合

答えて

1

は正しく、あなたはおそらく次

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 

デフォルトの継承startegyがSINGLE_TABLEで考えるshoul。少なくともJPA仕様ではこれを述べています。私は、私はもう一つのことを省略Hibernateはこちらをご覧

http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html

を取り、この

でJPA仕様に従っていることをかなり確信している: あなたの行動特性上@OneToOneまたは@ManyToOne annotatonを配置する必要がありますエンティティに参加しました。それ以外の場合は、単にプロパティのプロパティをシリアル化しています。

+0

あなたは正しく、InheritanceType.TABLE_PER_CLASSで動作します。私は抽象クラス "ActionBase"とGenericAction(そして他のアクション)をこのクラスに拡張します。 – Bevor

関連する問題