2014-05-20 177 views
0

我無法控制數據庫結構。但它是這樣設計的。一個人就像所有類型的人的基礎。然後創建一個Teacher類,其PK也引用Person的PK。問題是當我從另一個班級引用教師時,我得到「列號錯誤,應爲0」錯誤。JPA休眠 - 外鍵作爲主鍵

請幫助什麼是最好的方法。

@Entity 
@Table(name = "APP_Person") 
Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "PersonID", unique = true, nullable = false) 
    private Long personID; 

    @Column(name = "Name", length = 160) 
    @Size(max = 160) 
    private String name; 
} 

@Entity 
@Table(name = "APP_Teacher") 
public class Teacher implements Serializable 
{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    @ManyToOne(fetch = FetchType.LAZY) 
    @NotBlank 
    @JoinColumn(name = "PersonID", nullable = false) 
    Person person; 

    @Column(name = "Expertise", length = 160) 
    @Size(max = 160) 
    private String expertise; 
} 

@Entity 
@Table(name = "APP_Course") 
public class Course implements Serializable 
{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "CourseID", unique = true, nullable = false) 
    private Long courseID; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @NotBlank 
    @JoinColumn(name = "PersonID", unique = true, nullable = false) 
    Teacher teacher; 
} 
+0

難道你不應該將沒有構成它的'Person'擴展到'Teacher'嗎? – JamesENL

+0

我可以做到這一點,但是當我向老師添加一條記錄時,我希望將記錄插入教師和個人表中。那可能嗎?這就是我沒有繼承的原因 – JavaDev

回答

1

執行下列規定:

@Entity 
@Table(name = "Teacher") 
@PrimaryKeyJoinColumn 
public class Teacher extends Person{ 
    /* 
    * Note that Teacher doesn't have a PK, 
    * that's because its on the Person table 
    */ 

    @Column(name = "Expertise", length = 160) 
    @Size(max = 160) 
    private String expertise; 
} 

@Entity 
@Table(name = "Person") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class Person{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "PersonID", unique = true, nullable = false) 
    private Long personID; 

    @Column(name = "Name", length = 160) 
    @Size(max = 160) 
    private String name; 

    .... 
} 

這個配置會給你一個叫人用所謂的PERSONID一個主鍵表和一張桌子叫老師,只包含一個教師的具體領域。你可以保存一個老師,你將在老師的所有其他東西在人表中獲得老師特定的東西。如果不清楚這是做什麼,請告訴我,這樣我可以改進我的解釋。

+0

謝謝。我非常感謝你的回答 – JavaDev

+1

非常歡迎 – JamesENL

+0

它的確解決了我的問題! – JavaDev