Java 在数据提供程序中使用LoadableDetachableModel有何用途?

Java 在数据提供程序中使用LoadableDetachableModel有何用途?,java,wicket,wicket-1.5,Java,Wicket,Wicket 1.5,因为什么时候应该使用LDM还不是100%清楚,所以我尝试了一个简单的记忆测试。 我用一个数据提供者创建了一个DataView,它只创建了一个包含100个实体的列表,其中包含一些大数据(长字符串): 私有类HeavyDataProvider实现IDataProvider{ @凌驾 公共图书馆{ } @凌驾 公共迭代器要使LDM工作,您必须使用detach()方法实际分离数据。LDM用于数据库,在数据库中,您可以在下一次请求时仅在知道ID的情况下恢复/加载数据。因此,在detach()中,您将删除除

因为什么时候应该使用LDM还不是100%清楚,所以我尝试了一个简单的记忆测试。 我用一个数据提供者创建了一个DataView,它只创建了一个包含100个实体的列表,其中包含一些大数据(长字符串):

私有类HeavyDataProvider实现IDataProvider{
@凌驾
公共图书馆{
}
@凌驾

公共迭代器要使LDM工作,您必须使用detach()方法实际分离数据。LDM用于数据库,在数据库中,您可以在下一次请求时仅在知道ID的情况下恢复/加载数据。因此,在detach()中,您将删除除ID之外的所有数据(或者在需要时重新标记数据)在load()中(是否正确?当前无法锁定api),您将恢复数据


希望这能有所帮助。

您的LDM实现完全是错误的。它直接引用bean本身,然后返回它。这样,bean将沿着模型序列化,使其完全没有意义

你应该这样做:

@Override
public IModel<HeavyBean> model(final HeavyBean heavyBean) {
    final Integer id = heavyBean.getId();
    return new LoadableDetachableModel<HeavyBean>() {
        @Override
        protected HeavyBean load() {
            return ServiceLocator.get(HeavyDao.class).get(id);
        }
    };
}
@覆盖
公共IModel模型(最终重湾重湾){
最终整数id=heavyBean.getId();
返回新的LoadableDetachableModel(){
@凌驾
受保护的重型负载(){
返回ServiceLocator.get(HeavyDao.class).get(id);
}
};
}
如果使用
wicket ioc
模块,则可以将
HeavyDao
引用注入到所附页面/组件中


我认为Wicket非常易于使用,但您必须了解Java序列化的基础知识,否则您可能会导致http会话非常臃肿。

Hm,我一定是在测试过程中出错了。昨天,我试图简单地返回一个新的HeavyBean()在load方法中,因此不保留原始的HeavyBean,但这对结果没有影响。如果我现在重试,结果会更有意义:43,5KB。在这种情况下,在创建HeavyBean实例时,您不会将其传递给LDM吗?如果您将HeavyBean引用传递给LDM,它将在页面上序列化,我不这么认为,但如果我错了,请纠正我:传递给LDM构造函数的对象作为临时变量存储在LDM中,并在detach()时设置为null此外,仅仅为了获取id而加载实体也没有多大意义,永远不要使用数据提供程序加载的实体。如果在视图模式中使用Hibernate打开会话,则
get(id)
调用将重用会话缓存实例,这样您就不会再次访问数据库。但实际上,如果您将实例传递给构造函数,模型将重用此实例和
加载()
方法不会在此请求中调用。Tx,LDM不应该处理分离吗?我知道您可以覆盖onDetach,但我看不出还有什么可以在LDM.detach()中完成的操作?
        @Override
    public IModel<HeavyBean> model(final HeavyBean heavyBean) {
        return new LoadableDetachableModel<HeavyBean>() {

            @Override
            protected HeavyBean load() {
                return heavyBean;
            }
        };
    }
@Override
public IModel<HeavyBean> model(final HeavyBean heavyBean) {
    final Integer id = heavyBean.getId();
    return new LoadableDetachableModel<HeavyBean>() {
        @Override
        protected HeavyBean load() {
            return ServiceLocator.get(HeavyDao.class).get(id);
        }
    };
}