我遇到了 VoyageMongo 的问题。我在编辑它们时得到了重复的对象(即更改和保存已经持久化的对象),特别是那些覆盖#=和#hash.
这是(简化的)案例:我有一个UserAccount类,带有实例 vars email,salt(用于密码加密)和name. 这些是#=和#hash方法:
= anObject
(self isKindOf: anObject class)
ifFalse: [ ^ false ].
^ self email = anObject email and: [ self salt = anObject salt ]
hash
^ (self salt hash + self email hash) hash
email并且salt被设定在创造并且永不改变。现在,这是一个小脚本:
UserAccount removeAll.
20 timesRepeat: [ UserAccount new save ].
10 timesRepeat: [ UserAccount selectAll atRandom
name: 'Joe Doe';
save ].
UserAccount selectAll size = 20
这会生成 20UserAccount秒(#new在这种情况下创建一个带有随机电子邮件和盐的实例),然后随机选择 10 个并编辑它们的名称。的最终大小UserAccount selectAll 应该保持在 20,但它通常更大,这意味着它正在存储重复项。
可能的罪魁祸首:调试到VOCache,WeakKeyDictionary持有缓存对象(在reversedObjectsvar 中,对象本身是键)有时无法“命中”现有对象,因为随着键数组的增大#scanFor:,开始查看不同的点(更具体地说, )。#startIndexFor:发生这种情况时,我可以看到VOCache's内部的对象,reversedObjects但VOCache>>keyAtValue:找不到它。
长话短说:
- 是不是我不应该
#=在持久对象中覆盖?或者... - 是不是我
#hash的执行不好?
或者,当然,我没有看到的任何其他问题:)
非常感谢!
PS:使用最新的 VoyageMongo 在 Pharo 6.1 和 7 中对此进行了测试。