wicket LoadableDetachable模型的工作原理

Dil*_*lip 2 java wicket

我试图了解Wicket LoadableDetachable模型是如何工作的.我从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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我列出了DB中的所有产品.我正在为每个产品删除链接,当我们点击该链接时,我将从数据库中删除产品.单击"删除"链接后,页面未刷新意味着它仍显示已删除的产品.如果我添加此行productModel.detach(); 然后它正常工作.我的问题是为什么我必须调用productModel.detach(); 手动?LoadableDetachableModel假设自动做对了吗?

请帮我

Mar*_*rst 9

LoadableDetachableModel将检索到的对象缓存在其附加的持续时间内.当您load从数据库中获取数据时,所有项目都在那里.然后执行查询以删除记录,但不更新列表.因此,无论你必须改变你的onClick处理程序更新检索列表,或只是分离模型.

LoadableDetachableModel中没有任何魔力.看看下面的代码:

List<Person> people = dao.getListOfPeopleAttendingParty();

// assume that the number of people attending the party is 4
assert people.size() == 4;

Person guest = people.get(0);
dao.delete(guest);

// what is the number of people attending the party now?
assert people.size() == ?;
Run Code Online (Sandbox Code Playgroud)

你觉得people.size()现在怎么样?

LoadableDetachableModel的执行与上面的代码片段没有任何不同:

List<Person> people = peopleModel.getObject(); // is called by ListView

// assume that the number of people attending the party is 4
assert people.size() == 4;

Person guest = people.get(0);
dao.delete(guest);

// what is the number of people attending the party now?
assert people.size() == ?;
Run Code Online (Sandbox Code Playgroud)

所以:没有魔法,只有普通的Java和普通的逻辑.

PS.这两个问题的答案都是4,即使数据库不再保留客人