2009-05-24 41 views
1

所以,我不知道如何提出這個問題,因爲它似乎應該很容易找到這個問題的答案。使用一個實體(及其主鍵)作爲另一個實體的ID

我有3張桌子; ContentHeader,ContentType1和ContentType2。 ContentHeader有一個主鍵,自動遞增鍵。 ContentType1和ContentType2都將外鍵保存到ContentHeader的主鍵。這些外鍵也是它們各自表的主鍵。

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; 

我已經創建了四個類:

@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 { 
    ... 
} 

試圖生成模式時,這會拋出一個空指針。我很確定我只是缺少一些簡單的東西。我注意到了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() 
    // ... 
} 

這應該做的伎倆。

相關問題