首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wicket LoadableDetachable模型的工作原理

wicket LoadableDetachable模型的工作原理
EN

Stack Overflow用户
提问于 2012-05-15 13:09:33
回答 1查看 7.9K关注 0票数 2

我正在尝试了解Wicket LoadableDetachable模型是如何工作的。我从Wicket文档中了解到的是,在正常情况下,当请求完成时,处理wicket将自动序列化所有具有关联模型值的组件。这将消耗更多的内存。如果我们在序列化时使用LoadableDetachable模型,模型值将不会被序列化。这样对吗?因此,它将自动分离模型对象。那么,对于下一次请求,模型值将再次自动重新加载?请参阅我的以下代码。

代码语言:javascript
复制
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();
    }
}

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

请帮帮我

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-15 14:25:18

在附加对象期间,LoadableDetachableModel会缓存检索到的对象。当您从数据库load数据时,所有项都在那里。然后执行一个查询来删除一条记录,但不更新列表。因此,要么将onClick处理程序更改为also更新检索到的列表,要么直接分离模型。

在LoadableDetachableModel中没有魔法。看看下面的代码:

代码语言:javascript
复制
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() == ?;

你认为现在的people.size()是什么?

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

代码语言:javascript
复制
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() == ?;

所以:没有魔力,只有普通的Java和普通的逻辑。

PS。这两个问题的答案都是4,即使数据库不再保存来宾

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10594439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档