0

我有一个@OneToManyJPA 关联,该关联Curriculum具有多个WorkExperience.

我遇到的问题是,我希望能够在单个实体管理器调用中将一个课程与多个WorkExperience保持在一起。persist/save

我不知道如何将来自 html 表单的常规 HTTP POST 的几个 WorkExperiences 实例粘合到 Spring MVC 模型属性中的 java 集合/集...

首先,这可能吗?如果是这样,这是一个好主意,什么样的 html可以在常规 HTTP POST 中发布数据集合/数组?

CurriculumJPA 实体:

@Entity
public class Curriculum {
    ...
    @OneToMany
    private Set<WorkExperience> workExperiences;
    ...

WorkExperienceJPA 实体:

@Entity
public class WorkExperience {
...
4

1 回答 1

1

是的,有可能。Spring MVC 支持将 Lists/Maps 作为表单值发送。工作方式是通过下标值。对于列表,您使用列表编号,例如

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

对于地图,您可以使用地图键,例如

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

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

还要注意:您将不得不做一些视图端编码来动态添加/删除表单上的项目。这可能是一个真正的痛苦,因为删除不像你想象的那样工作。Spring MVC 能够添加到列表/地图,更改列表/地图中的项目,但我还没有找到直接从地图中删除项目的方法。我通常通过在我的 DTO 中添加一个“删除”布尔标志来处理删除,然后通过简单地在列表/映射中为该项目添加一个 form:hidden 元素来跟踪删除,并在我得到时清理服务器端的列表/映射它。

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

@OneToMany(cascade=CascadeType.PERSIST)

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

于 2013-04-01T20:04:33.963 回答