2010-03-18 69 views
0

我正在測試一個項目,使用Vaadin和Hibernate。我正在嘗試使用HbnContainer類將數據顯示到表中。問題是我不想顯示錶中兩個類的所有屬性。Vaadin表隱藏列和容器定製

例如:

@Entity 
@Table(name="users") 
class User { 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 
private String name; 

@ManyToOne(cascade=CascadeType.PERSIST) 
private UserRole role; 

//getters and setters 
} 

和第二類:

@Entity 
@Table(name="user_roles") 
class UserRole { 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 
private String name; 

//getters and setters 
} 

接下來,我檢索使用HbnContainer我的數據,並將其連接到表:

HbnContainer container = new HbnContainer(User.class, app); 
table.setContainerDataSource(container); 

該表只會顯示來自用戶的列,而對於「角色」,則會將角色ID代替。我如何隱藏該列,並將其替換爲UserRole.name?

我設法使用ColumnGenerator()來獲取表中的字符串值UserRole - 但我不能刪除以前的列,數值。

我錯過了什麼?或者,在顯示錶格之前「自定義」數據的最佳方式是什麼(如果我想在一個表格中顯示來自多個對象類型的數據..我該怎麼辦?)

如果我可以'我很快就會找到一個簡單的解決方案,我想我只是建立「手工」表。

那麼,對這件事的任何建議?

編輯:
我沒有表達自己以前。我需要知道的是如何在HbnContainer中使用嵌套pojos,並控制表中出現的屬性(和「子屬性」)。我試圖擴展並重新實現HbnContainer的某些部分,但是......無法正確執行。

對於前面的示例,從用戶表看起來像生成的表格:

Name |Role 
George| 1 
Alex | 2 

我想是這樣的:

Name | Role 
George| admin 
Alex | user 

回答

2

你想要做什麼是定義屬性應該在表中可見(因此不包括角色ID)。這可以通過setVisibleColumns()方法來實現。

0

我有同樣的問題,因爲你,這有助於(希望它可以幫助你太)

tblUsers.addGeneratedColumn("userRole", new Table.ColumnGenerator() { 
      public Object generateCell(final Table source, final Object itemId, final Object columnId) { 
       return new Label(userRoleService.getById(itemId.toString()).getName()); 
      } 
     }); 
1

而是隱藏列/添加生成列,您可以覆蓋表類formatPropertyValue方法。

final Table table = new Table() { 
    @Override 
    protected String formatPropertyValue(Object rowId, Object colId, Property property) { 
     if ("column".equals(colId)) { 
      return "something"; 
     } 

     return super.formatPropertyValue(rowId, colId, property); 
    } 
}; 

爲了讓POJO(在你的情況下用戶對象),可以使用這樣的結構:

User blogger = (User) ((HbnContainer.EntityItem.EntityItemProperty) property).getPojo();