这里以'景点+门票类型'的用例为示例,其对应关系为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属性值,如门票类型值:
"text" name="scenery.tbSceneryTickets[
这里注意的是索引的取法,这里的#h.id对应的是List中该门票类型对象的索引值,同时也是该门票类型对象在数据库中的主键值。所以修改提交时,Struts2通过ONGL表达式将每个门票类型对象的属性更新到服务器端的tbSceneryTickets列表中,由于存在hibernate的映射和级联设置,也可以顺利的更新到数据库中。
如果这时有新的门票类型在修改景点对象的时候插入,可用的策略是在浏览器端用java script来控制输入框的添加,并且维持一个唯一的索引,代码如下(代码中的索引i为大于0的动态数值):
门票类型:"text" name="newSceneryTickets[i].typeName" />
在服务器端维持一个名为newSceneryTickets的门票类型的List,前段提交后,Struts2通过ONGL表达式将每个新增的门票类型对象存入到服务器端的newSceneryTickets列表中,然后在将newSceneryTickets的中的每个门票类型对象存入tbSceneryTickets列表中,到由于存在hibernate的映射和级联设置,也可以顺利的插入到数据库中,并且自动建立新增门票类型对象和景点对象的对对应关系。