我在映射多對一關係時遇到問題,但沒有在數據庫中設置確切的外鍵約束。我使用OpenJPA實現MySql數據庫,但問題是生成的SQL腳本插入和選擇語句。在sql中未使用JoinColumn名稱
我有LegalEntity表,其中包含RootId列(等)。我也有地址表,其中有LegalEntityId列不可爲空,它應該包含引用LegalEntity的「RootId」列但沒有設置任何數據庫約束(外鍵)的值。
地址實體映射:
@Entity
@Table(name="address")
public class Address implements Serializable {
...
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(referencedColumnName="RootId", name="LegalEntityId", nullable=false, insertable=true, updatable=true, table="LegalEntity")
public LegalEntity getLegalEntity() {
return this.legalEntity;
}
}
SELECT語句(取LegalEntity的地址時),然後插入statment產生:
SELECT t0.Id, .., t0.LEGALENTITY_ID FROM address t0 WHERE t0.LEGALENTITY_ID = ? ORDER BY t0.Id DESC [params=(int) 2]
INSERT INTO address (..., LEGALENTITY_ID) VALUES (..., ?) [params=..., (int) 2]
如果我省略生成從上述報表表格屬性:
SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId WHERE t1.Id = ? ORDER BY t0.Id DESC [params=(int) 2]
INSERT INTO address (...) VALUES (...) [params=...]
因此,LegalEntityId不包含在聲明。
是否有可能根據這種引用建立關係(除了主鍵以外,沒有數據庫中的外鍵)?還有其他什麼遺漏嗎?
在此先感謝。
您寫的「LegalEntityId不包含在任何聲明中」。在這之上,你有'SELECT t0.Id,... FROM地址t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId ...'語句。 LegalEntityId顯示在JOIN條件中。所以你是什麼意思?我不明白。 – 2010-04-28 19:45:39
對不起,我的意思是LegalEntityId不包含在SELECT和INSERT語句中作爲列(即INSERT INTO地址(...,LegalEntityId)VALUES(...))。 – Vladimir 2010-04-29 06:43:50
好的,謝謝。您能否顯示'LegalEntity'的類定義,完整生成的SQL以及代碼創建,然後在實體上執行persist()或merge()?順便說一句,你刪除屬性'table =「LegalEntity」'是正確的。該屬性設置會強制列「LegalEntityId」到「LegalEntity」表中。但是你說它屬於table'address',這是缺少'table'屬性的缺省值。 – 2010-04-30 00:58:01