我花了大约一周的时间来弄清楚我无法解释的非常奇怪的行为。我不确定任何类型的代码是否会有所帮助,所以我只是解释一下情况:
我们有一个类“caseClass”,其中包含以下 DBList:
姓名 =product
好听的名字=product
自定义显示 =
{{velocity}}
#set ($propertyClass = $object.getxWikiClass().get($name))
#if ($type == 'edit')
{{html clean=false}}
$doc.displayEdit($propertyClass, $prefix, $object)
{{/html}}
#else
#set($listMap=$propertyClass.getMapValues())
#foreach($fieldKey in $object.getProperty($name).value)
#set($fieldValue=$listMap.get($fieldKey).getValue())
[[${fieldValue}>>$services.PropertyManager.getSourceURL(${fieldKey})]]
#end
#end
{{/velocity}}
显示类型 =select
多选 =true
由于盒子=10
多选分隔符 = []
- 空
加入分隔符 = ,
排序 =none
关系存储 =true
缓存 =false
休眠查询 =
SELECT idVarProp.value, CONCAT(codeVarProp.value, ' - ', naamVarProp.value, ' (', codeProdProp.value, ' - ', naamProdProp.value, ')')
FROM BaseObject obj, StringProperty idVarProp, StringProperty codeVarProp, StringProperty naamVarProp, StringProperty idVarProdProp,
BaseObject obj2, StringProperty idProdProp, StringProperty codeProdProp, StringProperty naamProdProp
WHERE obj.className = 'PDCKlassen.VariantClass' AND
obj2.className = 'PDCKlassen.ProductClass' AND
idVarProp.id.id = obj.id AND idVarProp.id.name = 'identificatieString' AND
codeVarProp.id.id = obj.id AND codeVarProp.id.name = 'codeVariant' AND
naamVarProp.id.id = obj.id AND naamVarProp.id.name = 'naamVariant' AND
idVarProdProp.id.id = obj.id AND idVarProdProp.id.name = 'product' AND
idProdProp.id.id = obj2.id AND idProdProp.id.name = 'identificatieString' AND
codeProdProp.id.id = obj2.id AND codeProdProp.id.name = 'productCode' AND
naamProdProp.id.id = obj2.id AND naamProdProp.id.name = 'naam' AND
idVarProdProp.value = idProdProp.value AND
obj.name <> 'PDCKlassen.VariantTemplate' AND obj2.name <> 'PDCKlassen.ProductTemplate'
ORDER BY codeProdProp.value, codeVarProp.value
XWiki 类名 = []
- 空
Id 字段名称 = []
- 空
值字段名称 = []
- 空
功能方面很明显,该字段可以包含 0 - n 次出现。
我们有一个基于 java 的侦听器,用于在页面上保存具有此类的一个(确切地说是一个)对象的页面,并带有版本注释:
xwikiContext.getWiki().saveDocument(XWikiDocument, comment, true, xwikiContext)
期望是页面的新(次要)版本与上述注释一起保存。
情况1:对象包含零引用(即为空)
以下是正在发生的事情的踪迹:
版本 1.1 - 这是初始版本 在生成保存文档(版本 1.1)的事件后,如上所述,结果是:
版本 1.2 - 使用保存传递的正确注释并作为注释“第一个注释”生成第二个事件以如上所述保存文档(这次是 1.2 版)并作为注释“第二个注释”结果是:
版本 1.2 - 未检测到更改。版本评论仍然是“第一评论”。
手动编辑页面并按下保存按钮,结果为:
1.3 版(选择了小修改)或2.1 版(未选择小修改)
如果我回到第一步(如Version 1.1之后所述),结果相同:第一个次要版本被保存,第二个未保存。
我已经检查了 XWiki 类中实际保存的所有内容。我可以看到在 XWiki 类中传递给 saveDocument 的信息是“正确的”数据。我也对此进行了测试minorEdit = false
,这给出了类似的结果
情况2:DBList 包含一个(或多个)引用(即不为空)
以下情况正在发生:
版本 1.1 - 这是初始版本
在生成如上所述保存文档(版本 1.1)的事件后,带有注释“first comment”。结果是:
版本 1.2 - 保存传递的正确注释和注释“第一条评论”
在生成第二个监听器事件后,如上保存文档(这次是1.2 版)并作为注释“第二条评论”,结果是:
1.3 版- 通过第二次保存传递的正确评论和评论“第二次评论”</p>
我已经寻找了各个方面,例如比较对象、纸张和诸如此类的东西,但我没有发现任何差异。
解决方案
直到我决定将“关系存储”更改为 false。这导致了正确的情况(由情况 2 描述 - 有一个空的 DBList 以及一个非空的 DBList)
此解决方案适用于我们的情况,但我们更喜欢选择关系存储 ( true
),因为我们不希望对 DBList 的大小有任何限制。
有没有人可以解释这种行为或可以确认这种情况正在发生?