2013-04-01 43 views
0

我有@OneToMany JPA與Curriculum的實例關聯,其中有WorkExperience的多個實例。在常規HTTP POST中發佈數據/對象的集合/數組

我的問題是,我希望能夠與幾個 WorkExperiences在實體管理器persist/save召集堅持一個課程。

我不知道如何膠水多個實例WorkExperiences從HTML形式的常規HTTP POST來一個java的收集/在Spring MVC模型屬性設置...

首先所有,這是可能的嗎?如果是的話,這是一個好主意,什麼樣的HTML可以發佈常規HTTP POST中的數據集合/數組?

Curriculum JPA實體:

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

WorkExperience JPA實體:

@Entity 
public class WorkExperience { 
... 

回答

1

是的,這是可能的。 Spring MVC支持發送列表/地圖作爲表單值。工作的方式是通過對值進行下標。對於一個列表,你可以使用表號,像

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

而對於一個地圖,你使用像

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

這assumming模型屬性有一個列表/地圖說,項目的地圖鍵。我會建議使用DTO並翻譯爲您的實體。這可能是矯枉過正,但我​​有一個問題,允許視圖直接操縱我的實體對象。

另外要注意的是:您將不得不做一些視角編碼來動態添加/刪除表單上的項目。這可能是一個真正的痛苦,因爲刪除不像你想象的那樣工作。 Spring MVC能夠添加到列表/地圖,更改列表/地圖中的項目,但我還沒有找到直接從地圖中刪除項目的方法。我通常通過在我的DTO中添加一個「remove」布爾標誌來處理刪除操作,然後通過在List/Map中簡單添加一個表單:該元素的隱藏元素來跟蹤刪除,並在我得到時清除服務器端的List/Map它。

一旦在服務器端獲得所有實體,就必須存儲它們。如果你想這是更多的自動魔法,只需設置一個annotaion你的父母像實體

@OneToMany(cascade=CascadeType.PERSIST) 

有幾個可用的CascadeType S,所以挑了一個有意義。

+0

非常感謝CodeChimp!它也似乎是Thymeleaf支持相同的語法,即根據文檔「$ {personsArray [0] .name}」。 – balteo

+0

曲線是標準EL(表達式語言)。我相信它是Servlet 2.5的一部分(也許是3.0) – CodeChimp