WebObjects/EOF/使用 EOF/破壞 EOF
您可能會在應用程式中看到以下問題
最近對我的應用程式進行了一些更改後,我遇到了一個非常討厭的小問題。該問題在測試中從未出現過,也很難製造(這很討厭)。在任意大量請求之後,任意一小部分獲取會失敗。也就是說,一些獲取會返回屬性全部為 null 的物件。例如,我希望獲取一個使用者名稱為“x”的 Member。我使用一個命名的 EOFetchSpecification,指定限定符繫結並獲取我的 EO。
EOFetchSpecification fetchSpec = EOFetchSpecification.fetchSpecificationNamed("usernameFetchSpec", "Member"); fetchSpec = fetchSpec.fetchSpecificationWithQualifierBindings(new NSDictionary("x", "usernameValue")); NSArray results = ec.objectsWithFetchSpecification(fetchSpec);
在大多數情況下,我都會收到預期的結果,但在某些情況下,NSArray 中的第一個 Member 物件的使用者名稱、密碼等都會為 null。
java.lang.IllegalStateException: 遇到一個具有擁有目標關係但沒有快照的新插入的 EO。java.lang.IllegalStateException: 遇到一個具有擁有目標關係但沒有快照的新插入的 EO。在 com.webobjects.eocontrol.EOEditingContext._processOwnedObjects(EOEditingContext.java:2150) 在 com.webobjects.eocontrol.EOEditingContext._processDeletedObjects(EOEditingContext.java:2192) 在 com.webobjects.eocontrol.EOEditingContext._processRecentChanges(EOEditingContext.java:1744) 在 com.webobjects.eocontrol.EOEditingContext.processRecentChanges(EOEditingContext.java:1951) 在 com.webobjects.eocontrol.EOEditingContext._processObjectStoreChanges(EOEditingContext.java:3536)
java.lang.IllegalStateException: rowDiffsForAttributes: com.webobjects.eoaccess.EODatabaseOperation 中的快照 { _dbSnapshot = {}; ... this = "<com.foo.bar.DownloadLog a849b0 _EOIntegralKeyGlobalID[DownloadLog (java.lang.Long)0]>"; }"; _globalID = _EOIntegralKeyGlobalID[DownloadLog (java.lang.Long)0]; _databaseOperator = "EODatabaseUpdateOperator"; } 不包含名為 downloadDate 的屬性的值,快照鍵為:downloadDate
堆疊跟蹤為:在 com.webobjects.eoaccess.EODatabaseOperation.rowDiffsForAttributes(EODatabaseOperation.java:338) 在 com.webobjects.eoaccess.EODatabaseContext.createAdaptorOperationsForDatabaseOperationAttributes(EODatabaseContext.java:5373) 在 com.webobjects.eoaccess.EODatabaseContext.createAdaptorOperationsForDatabaseOperation(EODatabaseContext.java:5548) 在 com.webobjects.eoaccess.EODatabaseContext.performChanges(EODatabaseContext.java:6365) 在 com.webobjects.eocontrol.EOObjectStoreCoordinator.saveChangesInEditingContext(EOObjectStoreCoordinator.java:415) 在 com.webobjects.eocontrol.EOEditingContext.saveChanges(EOEditingContext.java:3226) 在 net.global_village.eofextensions.ForgetfulEC.saveChanges(ForgetfulEC.java:54) 在 net.global_village.eofvalidation.EOEditingContext.saveChanges(EOEditingContext.java:126) 在 net.global_village.eofvalidation.NotifyingEditingContext.saveChanges(NotifyingEditingContext.java:159)
該異常是正確的,快照 _dbSnapshot = {}; 不包含任何值,更不用說它正在尋找的值了。我不確定這怎麼會發生。它並不一致。
我已經看到這種情況發生在欄位在 EOModel 中宣告的長度小於欄位中資料的實際長度時。
如果你想知道這些問題的原因,去照照鏡子!EOF 並沒有被破壞,是你濫用它,它在反擊。以下是需要檢查的內容