我正在使用Vaadin和Hibernate测试项目。我正在尝试使用HbnContainer类将数据显示到表中。问题是我不想在表中显示这两个类的所有属性。
例如:
@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 - 但是我无法使用数值删除上一列。
我错过了什么?或者,在显示表之前“自定义”数据的最佳方法是什么(如果我想在多个对象类型的表中显示数据......我该怎么办?)
如果我很快找不到简单的解决方案,我想我会“手工制作”表格。
那么,有关此事的任何建议吗?
修改:
我以前没有表达过自己。我需要知道的是如何使用嵌套的pojos和HbnContainer,并控制表中出现的属性(和“子属性”)。我试图扩展并重新实现HbnContainer的某些部分,但是......无法正常完成。
对于前面的示例,从Users表生成的表格如下所示:
Name |Role
George| 1
Alex | 2
我想要类似的东西:
Name | Role
George| admin
Alex | user
答案 0 :(得分:2)
您要做的是定义哪些属性应该在表中可见(从而排除角色ID)。这可以使用setVisibleColumns()方法实现。
答案 1 :(得分:1)
您可以覆盖Table类中的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对象),您可以使用以下结构:
User blogger = (User) ((HbnContainer.EntityItem.EntityItemProperty) property).getPojo();
答案 2 :(得分: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());
}
});