2017-01-30 19 views
0

假設下列多級結構:模型鏈接/「橋接」讀取多級結構爲平面

class Habitation { 
    private House house; 
    private List<Habitant> habitants; 
} 

需要顯示在平面形式爲在ListView每個居住者(這就是爲什麼多這個目的級別對象需要以平面形式表示)是這樣的:

| habitant.name | house.address | 
|  ...  |  ...  | 

我認爲這將是做正確的事:創建一個「架橋」 /鏈接對象是這樣的:

class PlanarHabitant { 
    private IModel<House> house; 
    private IModel<Habitant> habitant; 
} 

這種橋接對象從Habitation對象創建這樣的:

//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; 
} 

,並將該數據顯示在ListView中。它是這樣完成的:

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"))); 
     } 
    }; 

問題是標籤模型總是給出例外,即字段不存在。

我試圖分配CompoundPropertyModel(和其他人)到PlanarHabitant和不同的路徑表達式,但沒有任何工作。

我只是使用模型和路徑表達式的錯誤組合或是完全錯誤的方法?

多層次結構不應該轉換爲平面的原因是它需要被保存,House的重複在PlanarHabitant會在DB中產生重複,這不應該發生。

回答

2

你建設有模型嵌套對象的層次結構之間:項目

Model 
⟶ List<PlanarHabitant> 
    ⟶* PlanarHabitant 
      ⟶ Model<House> 
       ⟶ House 
      ⟶ Model<Habitant> 
       ⟶ Habitant 

每個ListView的有Model<PlanarHabitant>(這是自動爲您創建),因此,你的屬性表達式必須是"habitant.object.name"

當然,這將是最好只跳過嵌套模式:

class PlanarHabitant { 
    private House house; 
    private Habitant habitant; 
} 

通常當你看到非檢票對象(無分量也不模型本身)抱着一個模型的引用,有出亂子。

+0

確實如此,謝謝。我擔心的是,我的'Habitation'和'Habitant'對象包含'boolean'字段,我認爲它會創建一個副本。但它沒有發生(可能我的知識是誤導)。 並感謝您的建議。 – Eugene