在常规HTTP POST中发布数据/对象的集合/数组

时间:2013-04-01 16:29:14

标签: http jpa spring-mvc

我有一个@OneToMany JPA关联,其Curriculum实例有几个WorkExperience个实例。

我遇到的问题是,我希望能够将一个课程与单个实体经理中的一些 WorkExperience持续存在{{ 1}}来电。

我不确定如何将来自html表单的常规HTTP POST的多个实例的WorkExperience粘贴到Spring MVC模型属性中的java 集合/集 ...

首先,这有可能吗?如果是这样,那么什么样的HTML 可以在常规HTTP POST中发布数据集合/数组?

persist/save JPA实体:

Curriculum

@Entity public class Curriculum { ... @OneToMany private Set<WorkExperience> workExperiences; ... JPA实体:

WorkExperience

1 个答案:

答案 0 :(得分:1)

是的,有可能。 Spring MVC支持将Lists / Maps作为表单值发送。有效的方法是订阅价值。对于List,您可以使用列表编号,例如

<form:input path="myVal[1].property" />

对于地图,您使用地图键,如

<form:input path="myVal[key].property' />

这是假设您的模型属性具有所述项目的列表/地图。我建议使用DTO并翻译成您的实体。它可能有点过分,但是我在允许View直接操作我的Entity对象时遇到了问题。

另请注意:您必须执行一些View端编码才能动态添加/删除表单上的项目。这可能是一个真正的痛苦,因为删除不像你想象的那样工作。 Spring MVC能够添加到List / Map,改变List / Map中的项目,但我还没有找到直接从地图中删除项目的方法。我通常通过在我的DTO中添加“删除”布尔标志来处理删除,然后通过在List / Map中添加一个表单:隐藏元素来跟踪删除,并在我获得时清理服务器端的列表/地图它

在服务器端获得所有实体后,您必须存储它们。如果您希望这更具自动魔力,只需在您的父实体上设置注释,如

@OneToMany(cascade=CascadeType.PERSIST)

有几个CascadeType可用,所以选择一个有意义的。