2014-05-20 179 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