2014-05-20 5 views
0

DB 구조를 제어 할 수 없습니다. 그러나 그것은 이렇게 디자인되었습니다. 사람은 모든 유형의 사람의 기반과 같습니다. 그런 다음 교사의 수업이 만들어지며, 그 교사의 PK는 사람의 PK도 참조합니다. 문제는 내가 다른 클래스의 교사를 참조 할 때 "열의 수가 잘못되었습니다."라는 오류가 발생합니다.JPA Hibernate - 기본 키로 외래 키

친절히 최선의 appraoch 도움이됩니다.

@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

'교사'로 작성하지 않은 '사람'을 확장해서는 안됩니까? – 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라는 기본 키와 사람이라는 테이블, 단지 교사의 특정 필드를 포함하는 테이블라는 교사를 줄 것이다. 선생님을 구할 수 있으며 선생님의 다른 모든 것들을 Person 테이블에 담아 선생님에게 선생님에게 제공 할 것입니다. 이것이 무엇을하고 있는지 불분명하다면, 제게 설명을 상세하게 할 수 있도록 말해주십시오.

+0

고마워요. 나는 당신의 대답을 많이 주셔서 감사합니다 – JavaDev

+1

당신은 가장 환영합니다 – JamesENL

+0

그것은 실제로 내 문제를 해결! – JavaDev