0

私は先週かそこらを、説明できない非常に奇妙な行動を理解するのに費やしました. どんな種類のコードでも役立つかどうかわからないので、状況を説明します。

次の 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 を選択することをお勧めします ( )。

この動作を説明できる人、またはこれが起こっていることを確認できる人はいますか?

4

0 に答える 0