私は先週かそこらを、説明できない非常に奇妙な行動を理解するのに費やしました. どんな種類のコードでも役立つかどうかわからないので、状況を説明します。
次の DBList を含むクラス「caseClass」があります。
名前 =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 回のオカレンスを含めることができます。
このクラスの 1 つの (正確に 1 つの) オブジェクトを含むページをバージョン コメント付きで保存するために使用される Java ベースのリスナーがあります。
xwikiContext.getWiki().saveDocument(XWikiDocument, comment, true, xwikiContext)
ページの新しい (マイナー) バージョンが前述のコメントと共に保存されることが期待されます。
状況 1: オブジェクトに参照が含まれていない (つまり、空である)
以下は、何が起こっているかのトレースです。
バージョン 1.1 - これは初期バージョンです。前述のように、「最初のコメント」というコメントを付けてドキュメント (バージョン 1.1) を保存するイベントを生成した後、結果は次のようになります。
バージョン 1.2 - 保存によって渡され、コメント「最初のコメント」として適切なコメントを使用 上記のようにドキュメント (今回はバージョン 1.2) をコメント「2 番目のコメント」として保存する 2 番目のイベントを生成した後、結果は次のようになります。
バージョン 1.2 - 変更は検出されませんでした。バージョンコメントは「最初のコメント」のままです。
ページを手動で編集して保存ボタンを押すと、結果は次のようになります。
バージョン 1.3 (マイナー エディットが選択されている) またはバージョン 2.1 (マイナー エディットが選択されていない)
最初のステップ (バージョン 1.1の後で説明) に戻ると、同じ結果になります。最初のマイナー バージョンは保存されますが、2 番目のマイナー バージョンは保存されません。
XWiki クラスでの実際の保存まですべてを確認しました。XWiki クラスの saveDocument に渡された情報が「正しい」データであることがわかります。私もこれをテストしましたがminorEdit = false
、これは同様の結果をもたらします
状況 2: DBList に 1 つ (または複数) の参照が含まれている (つまり、空ではない)
次のことが起こっています。
バージョン 1.1 - これは初期バージョンです
ドキュメント (バージョン 1.1) を上記のようにコメント「最初のコメント」で保存するイベントを生成した後。結果は次のとおりです。
バージョン 1.2 - 保存によって渡された適切なコメントと、コメント「最初のコメント」
上記のように、ドキュメント (今回はバージョン 1.2 ) をコメント "second comment" として保存する 2 番目のリスナー イベントを生成すると、結果は次のようになります。
バージョン 1.3 - 2 回目の保存で渡された適切なコメントと、コメント「2 回目のコメント」</p>
オブジェクト、シートなどを比較するなど、さまざまな側面を探しましたが、違いを検出できませんでした。
解決
「リレーショナル ストレージ」を false に変更するまでは。これにより、適切な状況が発生しました (状況 2 で説明されています - DBList が空で、DBList が空でない場合)。
true
このソリューションはこの状況では機能しますが、DBList のサイズに制限を設けたくないため、Relation Storage を選択することをお勧めします ( )。
この動作を説明できる人、またはこれが起こっていることを確認できる人はいますか?