Java 模型链接/quot;“桥接”;将多层结构读入平面
假设以下多级结构:Java 模型链接/quot;“桥接”;将多层结构读入平面,java,wicket,Java,Wicket,假设以下多级结构: class Habitation { private House house; private List<Habitant> habitants; } 我认为应该这样做:创建一个“桥接”/链接对象,如下所示: | habitant.name | house.address | | ... | ... | class PlanarHabitant { private IModel<House> ho
class Habitation {
private House house;
private List<Habitant> habitants;
}
我认为应该这样做:创建一个“桥接”/链接对象,如下所示:
| habitant.name | house.address |
| ... | ... |
class PlanarHabitant {
private IModel<House> house;
private IModel<Habitant> habitant;
}
//Habitation.expand()
public List<PlanarHabitant> expand() {
List<PlanarHabitant> res = new ArrayList<PlanarHabitant>();
for (Habitant habitant : this.habitants) {
PlanarHabitant ph = new PlanarHabitant();
ph.setHouse(Model.of(this.house));
ph.setHabitant(Model.of(habitant));
res.add(ph);
}
return res;
}
final IModel<List<PlanarHabitant>> model = (IModel<List<PlanarHabitant>>) this.getDefaultModel();//model assigned is Model.ofList(Habitation.expand())
this.importList = new ListView<PlanarHabitant>("habitants", model) {
@Override
protected void populateItem(final ListItem<PlanarHabitant> item) {
item.add(new Label("cn", new PropertyModel(item.getModel(), "habitant.name")));
}
};
此数据将显示在ListView中。是这样做的:
| habitant.name | house.address |
| ... | ... |
class PlanarHabitant {
private IModel<House> house;
private IModel<Habitant> habitant;
}
//Habitation.expand()
public List<PlanarHabitant> expand() {
List<PlanarHabitant> res = new ArrayList<PlanarHabitant>();
for (Habitant habitant : this.habitants) {
PlanarHabitant ph = new PlanarHabitant();
ph.setHouse(Model.of(this.house));
ph.setHabitant(Model.of(habitant));
res.add(ph);
}
return res;
}
final IModel<List<PlanarHabitant>> model = (IModel<List<PlanarHabitant>>) this.getDefaultModel();//model assigned is Model.ofList(Habitation.expand())
this.importList = new ListView<PlanarHabitant>("habitants", model) {
@Override
protected void populateItem(final ListItem<PlanarHabitant> item) {
item.add(new Label("cn", new PropertyModel(item.getModel(), "habitant.name")));
}
};
final IModel model=(IModel)this.getDefaultModel()//指定的模型是列表的model.of(Habitation.expand())
this.importList=新列表视图(“居住者”,模型){
@凌驾
受保护的无效填充项(最终列表项){
添加(新标签(“cn”,新属性模型(item.getModel(),“habitant.name”));
}
};
问题是标签的模型总是给出字段不存在的异常
我尝试将CompoundPropertyModel
(和其他)分配给PlanarHabitat
和不同的路径表达式,但没有任何效果
我只是使用了错误的模型和路径表达式组合,还是完全错误的方法
不应将多层结构转换为平面结构的原因是需要保存多层结构,并且在
PlanarHabitat
中复制房屋将在DB中创建不应发生的复制。您正在构建嵌套对象的层次结构,模型介于两者之间:
Model
⟶ List<PlanarHabitant>
⟶* PlanarHabitant
⟶ Model<House>
⟶ House
⟶ Model<Habitant>
⟶ Habitant
通常,当您看到非Wicket对象(没有组件,也没有模型本身)持有对模型的引用时,就会出现问题。您正在构建嵌套对象的层次结构,其中模型位于:
Model
⟶ List<PlanarHabitant>
⟶* PlanarHabitant
⟶ Model<House>
⟶ House
⟶ Model<Habitant>
⟶ Habitant
通常,当您看到非Wicket对象(没有组件,也没有模型本身)持有对模型的引用时,就会出现问题。确实是这样,谢谢。我担心的是我的
Habitation
和habitat
对象包含boolean
字段,我想它只会创建一个副本。但这并没有发生(可能是我的知识被误导了)。谢谢你的建议。确实是的,谢谢你。我担心的是我的Habitation
和habitat
对象包含boolean
字段,我想它只会创建一个副本。但这并没有发生(可能是我的知识被误导了)。谢谢你的建议。