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 并没有被破坏,是你滥用它,它在反击。以下是需要检查的内容