假設這樣一個出現StackOverflow映射(休眠)
@Entity
public class User {
private Integer id
private List<Info> infoList;
@Id
public getId() {
return this.id;
}
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="USER_ID", insertable=false, updateable=false, nullable=false)
public getInfoList() {
return this.infoList;
}
public void addQuestion(Info question) {
info.setInfoCategory(InfoCategory.QUESTION);
info.setInfoId(new InfoId(getId(), getInfoList().size()));
getInfoList().add(question);
}
public void addAnswer(InfoRepository repository, Integer questionIndex, Info answer) {
Info question = repository.getInfoById(new InfoId(getId(), questionIndex));
if(question.getInfoCategory().equals(InfoCategory.ANSWER))
throw new RuntimeException("Is not a question");
if(question.getAnswer() != null)
throw new RuntimeException("You can not post a new answer");
answer.setInfoCategory(InfoCategory.ANSWER);
answer.setInfoId(new InfoId(getId(), getInfoList().size()));
getInfoList().add(answer);
question.setAnswer(answer);
}
}
查勘和問題,回答一個信息類
@Entity
public class Info implements Serializable {
private InfoId infoId;
private Info answer;
private InfoCategory infoCategory;
public Info() {}
@Embeddable
public static class InfoId {
private Integer userId;
private Integer index;
public InfoId(Integer userId, Integer index) {
this.userId = userId;
this.index = index;
}
@Column("USER_ID", updateable=false, nullable=false)
public getUserId() {
return this.userId;
}
@Column("INFO_INDEX", updateable=false, nullable=false)
public getIndex() {
return this.index;
}
// equals and hashcode
}
// mapped as a ManyToOne instead of @OneToOne
@ManyToOne
JoinColumns({
JoinColumn(name="USER_ID", referencedColumnName="USER_ID", insertable=false, updateable=false),
JoinColumn(name="ANSWER_INDEX", referencedColumnName="INFO_INDEX", insertable=false)
})
public Info getAnswer() {
return this.answer;
}
@EmbeddedId
public InfoId getInfoId() {
return this.infoId;
}
}
在的getAnswer映射我使用的,而不是OneToOne多對一,因爲一些問題與OneToOne映射相關。 OneToOne可以映射爲ManyToOne(@JoinColumn中的unique = true)。 INFO_INDEX與任何特定用途無關。只是爲了在LEGACY系統中支持複合主鍵的一個關鍵。
應答之前,照顧以下的:
如果一個對象具有分配的標識符,或複合密鑰,標識符應當被分配給該對象實例之前調用save()
因此,我必須映射JoinAnswer中的JoinColumn(name =「USER_ID」,referencedColumnName =「USER_ID」,insertable = false,updateable = false),因爲Hibernate不允許兩個可變屬性共享相同的列表(userId也使用USER_ID )否則我會在回答公關中得到USER_ID operty必須插入=假,可更新=假
現在來看看的getAnswer映射
@ManyToOne
JoinColumns({
JoinColumn(name="USER_ID", referencedColumnName="USER_ID", insertable=false, updateable=false),
JoinColumn(name="ANSWER_INDEX", referencedColumnName="INFO_INDEX", insertable=false)
})
因爲,休眠抱怨你不能混用不同的插入和更新的映射
我應該怎麼爲了傳遞它嗎?
保重它是一個LEGACY系統。
問候,
好CHSS,其實是多對一。我使用它而不是OneToOne,因爲一些問題與OneToOne映射有關。 OneToOne可以映射爲ManyToOne(@JoinColumn中的unique = true)。 INFO_INDEX與任何特定用途無關。只是爲了在LEGACY系統中支持複合主鍵的一個關鍵。我明天會嘗試。問候, – 2009-09-11 03:15:58