2

Wicket LoadableDetachable モデルがどのように機能しているかを理解しようとしています。Wicket のドキュメントから理解できることは、通常のシナリオでは、リクエストの処理が完了すると、Wicket は関連付けられたモデル値を持つすべてのコンポーネントを自動的にシリアル化します。これはより多くのメモリを消費します。シリアライズ時に LoadableDetachable モデルを使用すると、モデル値はシリアライズされません。これは正しいですか?. したがって、モデル オブジェクトは自動的に切り離されます。次のリクエストでは、モデル値は自動的に再度リロードされますか? 以下のコードを参照してください。

public class ProductListPanel extends Column<Product> {

    @SpringBean
    private ProductService productService;
    private List productList;


    public ProductListPanel(String id) {
        super(id);
        class ProductModel extends LoadableDetachableModel {

            @Override
            public void detach() {
                // TODO Auto-generated method stub
                productList = null;
                System.out.print("Called Detach Object\n");
            }


            @Override
            protected Object load() {
                // TODO Auto-generated method stub
                productList = productService.findAll();
                System.out.print("Called Get Object\n");
                return productList;
            }

        }
        System.out.print("Before creating also calling\n");
        final ProductModel productModel = new ProductModel();

        ListView view = new ListView("list", productModel) {

            protected void populateItem(ListItem item) {
                System.out.print("\nBefore start also calling\n");
                System.out.print("Before this one is callling \n");
                Product result = (Product) item.getModelObject();
                item.add(new Label("code", result.getCode()));
                item.add(new Label("name", result.getName()));
                final Link deleteLink = new Link("remove", item.getModel()) {

                    @Override
                    public void onClick() {
                        Product product = (Product) getModelObject();
                        productService.delete(product);

                    }

                };
                item.add(deleteLink);

            }
        };

        add(view);
        Link addProductLink = new Link("addProduct") {

            @Override
            public void onClick() {
                // TODO Auto-generated method stub
                setResponsePage(new AddProduct());
            }

        };
        add(addProductLink);
        productModel.detach();
    }
}

上記のコードでは、DB からすべての製品をリストしています。各製品のリンクを削除しています。そのリンクをクリックすると、DBから製品が削除されます。[削除] リンクをクリックした後、ページが更新されず、削除された製品がまだ表示されていることを意味します。この行を追加すると、productModel.detach(); その後、正常に動作しています。ここでの私の質問は、productModel.detach(); を呼び出さなければならない理由です。手動?LoadableDetachableModel が自動的に実行されると仮定しますか?

私を助けてください

4

1 に答える 1