2011-10-24 27 views
1

我有一對多映射的問題。
兩張表問題(PK(id),文本)和答案(PK(id,questionId),文本)
在我的應用程序中,我以只讀模式使用這些表。
我想這個表OneToMany和複雜的PK

@Entity 
@Table(name = "QUESTIONS") 
public class Question { 
    @Id 
    @Column(name = "QUESTIONID") 
    private long questionId; 
    @Column(name = "QUESTIONTEXT") 
    private String questionText; 
    @OneToMany(mappedBy = "question", fetch = FetchType.EAGER) 
    private List<Answer> answers;   
} 

@Entity 
@Table(name = "ANSWERS") 
public class Answer implements Serializable { 

    @EmbeddedId 
    private AnswerPK AnswerPK; 
    @Column(name = "ANSWERTEXT") 
    private String answerText; 
    @ManyToOne 
    @JoinColumn(name = "QUESTIONID", insertable = false, updatable = false) 
    private Question question; 
} 

@Embeddable 
public class AnswerPK implements Serializable { 
    @Column(name = "QUESTIONID") 
    private long questionId; 
    @Column(name = "ANSWERID") 
    private int answerId; 
} 

但是當我使用@JoinColumn將建立外鍵之間的關係定義。
,當我嘗試填寫表格,我得到異常

java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (ZODI.FK_ANSWERS_QUESTIONID) violated - child record found 

回答

1

嘗試把插入/更新=假在EmbeddedId,而不是JoinColumn。

另外考慮不使用EmbeddedId,而是使用IdClass,那麼你只需要用@Id註解answerId和問題。或者甚至更好,從主鍵中移除questionId並確保answerId是唯一的(例如使其成爲生成的ID)。

見, http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationships

+0

謝謝回答。但我現在使用這種關係(子查詢)醜陋的黑客攻擊 – Sarge