2009-05-24 111 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() 
    // ... 
} 

这应该做的伎俩。

相关问题