2013-07-23 83 views
1

我使用的EclipseLink 2.4.0,我試圖找到一種方法來生成以下DDL語句:如何創建多個引用同一個表的複合外鍵約束?

ALTER TABLE DELTA ADD CONSTRAINT DELTAFK1 FOREIGN KEY (APPKEY, NEWREVISION) REFERENCES REVISION (APPKEY, REVISION); 
ALTER TABLE DELTA ADD CONSTRAINT DELTAFK2 FOREIGN KEY (APPKEY, OLDREVISION) REFERENCES REVISION (APPKEY, REVISION); 

在DELTA表的每一行表示兩個指定的修訂和主鍵之間的變化由APPKEY,NEWREVISION和OLDREVISION組成。僅正在與所述Delta.java類中定義的以下關係註釋生成的第一ALTER語句:

public class Delta { 

@EmbeddedId 
private DeltaPK deltaPk; 

@ManyToOne 
@PrimaryKeyJoinColumns({ 
     @PrimaryKeyJoinColumn(name="appKey", referencedColumnName="appKey"), 
     @PrimaryKeyJoinColumn(name="newRevision", referencedColumnName="revision") 
}) 
private Revision newRevision; 

@ManyToOne 
@PrimaryKeyJoinColumns({ 
     @PrimaryKeyJoinColumn(name="appKey", referencedColumnName="appKey"), 
     @PrimaryKeyJoinColumn(name="oldRevision", referencedColumnName="revision") 
}) 
private Revision oldRevision; 

每個PrimaryKeyJoinColumn的名稱值,「的AppKey」,「oldRevision」和「newRevision」是各個領域的在DeltaPK類中定義,並且referencedColumnName值是Revision類中定義的字段。

我已經嘗試了一堆變體,而且我得到的最接近的是當我註釋掉oldRevision對象的'appKey'的PrimaryKeyJoinColumn。然後生成第二個alter語句,但它只包含oldRevision值(不是appKey),就像您所期望的那樣。任何想法或建議如何做到這一點將不勝感激。

+0

您是否嘗試過使用joincolumn批註並使其可插入= false,updateable = false而不是PrimaryKeyJoinColumn批註? – Chris

+0

是的,我試過了,不幸的是我得到了同樣的結果。 –

回答

0

在我發現如何解決這個問題之前,我不得不在調試器中瀏覽EclipseLink源代碼一段時間。事實證明,我原來的問題中沒有提到問題的一個關鍵部分(因爲我不知道它是問題的一部分)。字段「的AppKey」和修訂類「修正」是不是該表的主鍵,但是,他們做了一個唯一性約束:

@Table(
    name = "REVISION", 
    uniqueConstraints = @UniqueConstraint(columnNames = {"appKey", "revision"}) 
) 

原來,的EclipseLink正在生成的名字外鍵約束部分基於此唯一性約束中列名的排序。這導致我的外鍵約束被生成爲具有相同的名稱,最終導致第二個被忽略並且不被生成。 (見org.eclipse.persistence.tools.schemaframework.TableDefinition下面的方法,如果你想放在一起的所有細節。)

buildForeignKeyConstraint(List<String> fkFieldNames, List<String> pkFieldNames, TableDefinition targetTable, DatabasePlatform platform) 
buildForeignKeyConstraintName(String tableName, String fieldName, int maximumNameLength, DatabasePlatform platform) 
addForeignKeyConstraint(ForeignKeyConstraint foreignKey) 

總之,當我簡單地重新排序的值cloumnNames像這樣:

@UniqueConstraint(columnNames = {"revision", "appKey"}) 

我兩個不同命名的外鍵約束(因爲「修訂版」和「newRevison」和「oldRevision」兩者之間的映射),如下圖所示:

ALTER TABLE DELTA ADD CONSTRAINT DELTA_NEWREVISION FOREIGN KEY (NEWREVISION, APPKEY) REFERENCES REVISION (REVISION, APPKEY) 
ALTER TABLE DELTA ADD CONSTRAINT DELTA_OLDREVISION FOREIGN KEY (OLDREVISION, APPKEY) REFERENCES REVISION (REVISION, APPKEY) 

你可能會得到slightl y不同的數據庫平臺的輸出(我使用的是Derby),但我認爲一般問題和解決方案是相同的。我希望我解釋清楚,以便將來幫助別人。

相關問題