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
字段,我想它只会创建一个副本。但这并没有发生(可能是我的知识被误导了)。谢谢你的建议。