2010-04-28 60 views
1

我在映射多對一關係時遇到問題,但沒有在數據庫中設置確切的外鍵約束。我使用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不包含在聲明。

是否有可能根據這種引用建立關係(除了主鍵以外,沒有數據庫中的外鍵)?還有其他什麼遺漏嗎?

在此先感謝。

+0

您寫的「LegalEntityId不包含在任何聲明中」。在這之上,你有'SELECT t0.Id,... FROM地址t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId ...'語句。 LegalEntityId顯示在JOIN條件中。所以你是什麼意思?我不明白。 – 2010-04-28 19:45:39

+0

對不起,我的意思是LegalEntityId不包含在SELECT和INSERT語句中作爲列(即INSERT INTO地址(...,LegalEntityId)VALUES(...))。 – Vladimir 2010-04-29 06:43:50

+0

好的,謝謝。您能否顯示'LegalEntity'的類定義,完整生成的SQL以及代碼創建,然後在實體上執行persist()或merge()?順便說一句,你刪除屬性'table =「LegalEntity」'是正確的。該屬性設置會強制列「LegalEntityId」到「LegalEntity」表中。但是你說它屬於table'address',這是缺少'table'屬性的缺省值。 – 2010-04-30 00:58:01

回答

0

嘗試將您的FetchType更改爲渴望。在通過調用getLegalEntity請求之前,OpenJPA不應查詢LegalEntity。

此外,沒有約束應該不重要(有人請糾正我,如果我錯了)。

+0

什麼都沒發生,它仍然產生相同的SQL。 – Vladimir 2010-04-28 13:04:18