2009-05-24 3 views
1

Also ich bin mir nicht sicher, wie ich diese Frage stellen soll, da es scheint, dass es ziemlich einfach sein sollte, die Antwort auf diese Frage zu finden.Verwenden einer Entität (und deren Primärschlüssel) als eine andere Entity-ID

Ich habe 3 Tabellen; ContentHeader, ContentType1 und ContentType2. ContentHeader verfügt über einen primären Autoinkrementschlüssel. ContentType1 und ContentType2 enthalten beide Fremdschlüssel für den Primärschlüssel von ContentHeader. Diese Fremdschlüssel sind auch die Primärschlüssel für ihre jeweiligen Tabellen.

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; 

Ich habe vier Klassen erstellt:

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

Dies wirft einen Nullzeiger, wenn sie versuchen, das Schema zu generieren. Ich bin mir ziemlich sicher, dass ich einfach etwas Einfaches vermisse. Ich habe die PrimaryKeyJoinColumn bemerkt, aber ich bin mir nicht sicher, ob es das ist, was ich brauche oder nicht.

Antwort

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() 
    // ... 
} 

Das sollte den Trick tun.