0

ModeShape を使い始めたばかりですが、質問があります。nodeType の定義を (nodeTypeMgr.registerNodeTypes(File, true) 経由で) 変更することは可能ですか?

Let's say I add a field to a noteType, I noticed that even after executing the method call above, calling setProperty() on an existing node (persisted when the old nodeType definition was in place) results in a ConstraintViolationException.

動作が仕様によるものである場合、ノードを削除し、再度永続化して修正しますか? または、ノードを新しい定義に「更新」する呪文がありますか?

JBossAS 7.1.1.Final で ModeShape 3.1.0.Final を使用しています。

4

1 に答える 1

2

ModeShape では、既存のノード タイプを変更/更新することができます。さらに変更を加えると、既存のコンテンツが「無効」になる可能性があります。これは、JSR-283仕様が実装に任せている領域です。たとえば、セクション19.2.4.1「ノード・タイプの更新」には次のように記載されています:

ノード タイプの管理をサポートするリポジトリは、既存のノードのタイプとしてすでに使用されているノード タイプの更新をサポートする場合があります。そのような機能の範囲は、実装に依存します。たとえば、既存のコンテンツを無効にしない変更のみを許可する実装もあれば、より大きな変更を許可する実装もあります。結果として生じる非互換性がどのように解決されるかは、実装にも依存します。

ModeShape はより寛容な変更を実装しているため、ノード タイプを更新する際には適切な方法と手順を使用することをお勧めします。必須のプロパティ定義または子ノード定義をノード タイプに追加することがわかっている場合は、それを行う前にその影響を考慮し、コンテンツを更新するようにしてください (ノード タイプが変更される前または後に、ノード タイプが変更されるかどうかによって異なります)。残りのプロパティまたは残りの子ノードを許可する場合があります)。

ノード タイプに残りのプロパティ定義や子ノード定義がない場合は、複数の手順で変更を実装することが理にかなっている場合があります。

  1. ノード タイプを最初に、非必須 (オプションなど) のプロパティ定義および/または子ノード定義で登録します。
  2. ノード タイプを使用する既存のコンテンツを変更し、新しいプロパティや子ノードを追加します。ナビゲーションまたはクエリを使用して、変更が必要なノードを見つけます。
  3. 同じプロパティ定義または子ノード定義を使用して、ノード タイプを登録しますmandatory

または、リポジトリで意味がある場合は、プロパティ定義を新しい mixin として追加します。ミックスインが登録されたら、新しいコンテンツで使用を開始できます。また、新しいプロパティ (またはプロパティ) を追加する既存のノードに戻ってミックスインを追加できます。

また、ノード タイプを最初に作成するときに、ノード タイプがどのように進化するかを検討することをお勧めします。進化は、デザインに影響を与えるいくつかの側面の 1 つにすぎません。

ノード タイプを更新する際の課題は、実行する必要があること (およびその最適な方法) がノード タイプの詳細に大きく依存することです。これが、このプロセスの多くをあなたに任せることにした理由です。別の方法としては、ModeShape がノード タイプで許可される更新の種類をはるかに制限し、多くのノード タイプの更新を防止および/または制限することでした。

于 2013-02-12T13:56:21.660 に答える