這裡以'景點+門票類型'的用例為示例,其對應關系為1-N,在數據庫中門票類型表包含了對應門票的外鍵。使用Hibernate的的級聯操作從數據庫中取出的景點對象scenery,scenery對象包含門票類型列表(List類型)tbSceneryTickets。景點的hbm文件的有如下的one-to-many設置:
需要注意的是這裡通過index屬性設置了List的索引為門票類型的ID(所以這裡需要設置其主鍵ID為數字)。
在JSP中取得tbSceneryTickets中每個對象的值時候,使用struts2的iterator標簽,通過OGNL表達可以設置其value屬性的值為“scenery.tbSceneryTickets”,通過設置其id屬性來標識每個對象,代碼如下:
在取得tbSceneryTickets中每個門票類型對象的值的時候,可以將其索引和屬性作為頁面標簽的name屬性值,如門票類型值:
<input type="text" name="scenery.tbSceneryTickets[<s:property value='#h.id'/>].typeName"
這裡注意的是索引的取法,這裡的#h.id對應的是List中該門票類型對象的索引值,同時也是該門票類型對象在數據庫中的主鍵值。所以修改提交時,Struts2通過ONGL表達式將每個門票類型對象的屬性更新到服務器端的tbSceneryTickets列表中,由於存在hibernate的映射和級聯設置,也可以順利的更新到數據庫中。
如果這時有新的門票類型在修改景點對象的時候插入,可用的策略是在浏覽器端用JavaScript來控制輸入框的添加,並且維持一個唯一的索引,代碼如下(代碼中的索引i為大於0的動態數值):
門票類型:<input type="text" name="newSceneryTickets[i].typeName" />
在服務器端維持一個名為newSceneryTickets的門票類型的List,前段提交後,Struts2通過ONGL表達式將每個新增的門票類型對象存入到服務器端的newSceneryTickets列表中,然後在將newSceneryTickets的中的每個門票類型對象存入tbSceneryTickets列表中,到由於存在hibernate的映射和級聯設置,也可以順利的插入到數據庫中,並且自動建立新增門票類型對象和景點對象的對對應關系。