2010-03-18 32 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();