自动填充集
有什么像AutoPopulatingList
但是对于Set
? 我想要显示的数据是使用Set
的关联。
public class Employer implements java.io.Serializable { private Set employees = new HashSet(); }
我尝试过使用AutoPopulatingList
但是在这种情况下我必须在hibernate中使用List
,这需要我使用Employee.employeeId
指定list-index
,每当我通过Employee
检索employees
,列表将在element( null
元素)之间有空格依赖在Employee.employeeId
。
我需要自动填充集合,因为我需要在创建Employer
动态生成employees
。 当我使用普通Set
时,我得到以下内容: org.springframework.beans.InvalidPropertyException: Invalid property 'employees[0]' of bean class [model.Employer]: Cannot get element with index 0 from Set of size 0, accessed using property path 'employees[0]'
还有其他解决方案吗?
编辑
我正在尝试实现动态表单
您不能在MVC中将Set
用作绑定目标,因为无法为其项创建属性路径。
你应该用什么
在构建动态表单时Map
您应该使用Map
。 我们多次实施(所以我知道它有效)是这样的:
- 简单的数字序列用作键而不与实际项目连接
- 键序列总是在增加,但不需要连续(例如,如果用户将删除第二项,您将最终得到1,3,4
1, 3, 4, ...
) - 如果你想添加另一个项目,你只需找到最高的数字,然后添加用
maxIndex + 1
索引的表格(总是增加序列) -
Map
实现必须是LinkedHashMap
实例,以便保留迭代顺序(如果Map
字段需要自动填充,则Spring默认创建此实现) -
Map
必须是某个父窗体对象的一部分(即,您不能将Map
作为顶层窗体对象),以便Spring能够从属性getter中推断出generics类型
视图和JavaScript实现示例
有很多方法可以解决这个问题。 例如,我们有一个特殊的模板子表单 ,当我们需要动态添加另一个子表单时使用它。 这种方法可能要复杂一些:
<%-- ... other fields ... --%> <%@ include file="user-subform.jspf" %> <%-- other form fields, submit, etc. --%> <%@ include file="user-subform.jspf" %>
现在您可以询问“用户如何删除子表单” ? 如果子表单JSPF包含以下内容,这非常简单:
“无法获取索引为0的元素”..集合不是基于以…开头的索引。
为什么不使用员工的LazyList ..正如@PavelHoral正确指出的那样,我们不需要使用LazyList,因为Spring处理它..一个简单的List初始化(如新的ArrayList())会做,虽然有可能当用户提交非连续元素时有空格(空值)。
private List employees = new ArrayList ();
Set不是索引集合,您只能绑定索引集合或数组。 您可以尝试使用LinkedHashSet(一个具有保证顺序,而HashSet不具有)或使用List实现来绑定值。