2011-10-24 28 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