2009-05-24 8 views
1

この質問に答える方法がわかりにくいように、この質問をどのように行うのかよく分かりません。エンティティ(およびそれらの主キー)を別のエンティティのIdとして使用する

私は3つのテーブルを持っています。 ContentHeader、ContentType1およびContentType2。 ContentHeaderには、プライマリの自動インクリメントキーがあります。 ContentType1とContentType2はどちらもContentHeaderの主キーへの外部キーを保持します。これらの外部キーもそれぞれのテーブルの主キーです。

@Entity 
public class ContentHeader { 

    @Id 
    @GeneratedValue 
    protected int contentID; 

    ... 
} 

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class Content { 

    @Id 
    @OneToOne 
    protected ContentHeader contentHeader; 

    ... 
} 

@Entity 
public class ContentType1 extends Content { 
    ... 
} 

@Entity 
public class ContentType2 extends Content { 
    ... 
} 

スキーマを生成しようとするとこれはヌルポインタをスロー:

CREATE TABLE contentHeader (contentID INT AUTO_INCREMENT PRIMARY KEY, ...) ENGINE=InnoDB; 

CREATE TABLE contentType1 (contentID INT PRIMARY KEY, FOREIGN KEY (contentID) REFERENCES contentHeader (contentID), ...) ENGINE=InnoDB; 

CREATE TABLE contentType2 (contentID INT PRIMARY KEY, FOREIGN KEY (contentID) REFERENCES contentHeader (contentID), ...) ENGINE=InnoDB; 

私は4つのクラスを作成しました。私はちょっと単純なものを見逃していると確信しています。私はPrimaryKeyJoinColumnに気付きましたが、私が必要としているかどうかは分かりません。

答えて

2
You can create a composite id class that only have the ContentHeader: 

@Embeddable 
public class ContentKey implements java.io.Serializable { 

    @ManyToOne(cascade = {}, fetch = FetchType.LAZY) 
    @JoinColumn(name = "ID", updatable = true) 
    private ContentHeader header; 
    // ... 
} 

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class Content { 

    @Id 
    public ContentKey getContentKeyId() 
    // ... 
} 

これはすべきことです。

関連する問題