1

バッキングBeanedit()メソッドでは、次のコードがあります

public void edit(Entity e) {
    this.entity = entityService.find(e);
    this.entity.setLazyList(new ArrayList(this.entity.getLazyList()));
}
public Entity getEntity() {
    return this.entity;
}

示されているように、レイジーリストを自分ので変更して初期化しましたArrayList奇妙なことに、内部のレイジーリストはメソッドPersistentBagが存在するとすぐに返されedit()ます。この動作を見つけるために私がしたこと:

  1. editメソッドにブレークポイントを設定します。見つけた後、私はそれが101であると言う、設立されたエンティティのJVMIDを見る。
  2. メソッドにブレークポイントを設定しgetEntity()ます。edit()存在した後、getEntity()が呼び出され、エンティティのJVM IDは101のままですが、entity.lazyListPersistentBag代わりにありArrayListます。

私のLazyListはにバインドされています。このPersistentBagにより、JSFページの保存ボタンを押すとLazyInitializationExceptionが発生します。Mojarraのこの部分(MyFacesでもテストされており、例外もスローされます)が原因で、例外がスローされます(バッキングBeanのsave()メソッドが呼び出される前)。

MenuRenderer、行:365

// No cloned instance so if the modelType happens to represent a
// concrete type (probably not the norm) try to reflect a
// no-argument constructor and invoke if available.
if (targetCollection == null) {
    //noinspection unchecked
    targetCollection =
          createCollection(currentValue, modelType);
}

残念ながらはPersistentBagであるためcurrentValue(また初期化されているため)、createCollection()は、セッションとロードされたオブジェクトを認識しないこのオブジェクトの新しいインスタンスを返します。

4

1 に答える 1

0

<f:attribute name="collectionType" value="java.util.ArrayList" />私の中に追加しただけ<h:selectManyCheckBox>で、怠惰な例外が解決しました。ArrayListを使用してPersistentBagを手動で変更する必要はもうありません。

this.entity.setLazyList(new ArrayList(this.entity.getLazyList()));

この属性(MojarraとMyFacesの両方で機能します)は、要素にバインドされた元のタイプの代わりにこのコレクションタイプを使用するようにJSFimplに指示します。

<h:selectManyCheckbox value="#{backingBean.entity.lazyList}">
     <f:attribute name="collectionType" value="java.util.ArrayList" />
     <f:selectItems value="#{backingBean.allItems}" var="i" itemLabel="#{i.title}"/>
</h:selectManyCheckbox>
于 2012-12-27T05:26:38.510 に答える