自动填充集

有什么像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实现来绑定值。

Interesting Posts