Dear René
I changed my jsp page so as to integrate the following block: <s:iterator value="parent.values" status="rowstatus"> <s:hidden name="parent.values[%{#rowstatus.index}].id" value="%{id}" /> <s:textfield name="parent.values[%{#rowstatus.index}].name" value="%{name}" /> </s:iterator> which generates the following html code: <input type="hidden" name="parent.values[0].id" value="1" id="saveOrUpdateParent_parent_values_0__id"/> <tr> <td class="tdLabel"></td> <td><input type="text" name="parent.values[0].name" value="Child1" id="saveOrUpdateParent_parent_values_0__name"/></td> </tr> <input type="hidden" name="parent.values[1].id" value="2" id="saveOrUpdateParent_parent_values_1__id"/> <tr> <td class="tdLabel"></td> <td> <input type="text" name="parent.values[1].name" value="Child2" id="saveOrUpdateParent_parent_values_1__name"/></td> </tr> I can display my complete Child Set but I got the same result after updating: my Child Set is empty. Is that necessary to modify my ParentAction as well? If yes what to do? public class ParentAction extends ActionSupport implements ModelDriven<Parent> { private static final long serialVersionUID = -2662966220408285700L; private Parent cl = new Parent(); private List<Parent> clList = new ArrayList<Parent>(); private ParentDAO clDAO = new ParentDAOImpl(); @Override public Parent getModel() { return cl; } public String saveOrUpdate() { // cl.values is empty here!! clDAO.saveOrUpdateParent(cl); return SUCCESS; } public String save() { clDAO.saveParent(cl); return SUCCESS; } public String list() { clList = clDAO.listParent(); return SUCCESS; } public String delete() { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); clDAO.deleteParent(Long.parseLong(request.getParameter("id"))); return SUCCESS; } public String edit() { // cl.values contains some valid Child elements here!! HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); cl = clDAO.listParentById(Long.parseLong(request.getParameter("id"))); } return SUCCESS; } public Parent getParent() { return cl; } public void setParent(Parent cl) { this.cl = cl; } public List<Parent> getParentList() { return clList; } public void setParentList(List<Parent> clList) { this.clList = clList; } } > Date: Thu, 1 Apr 2010 11:30:23 +0200 > From: gie...@it-neering.net > To: user@struts.apache.org > Subject: Re: CRUD with a OneToMany association under Struts 2 / Hibernate 3 > > Given the model you presented in the first post, your problem seems to > be that the posted values have not the correct name for the children's > form fields. The parameters names you would need are > > id > name > values[0].id > values[0].name > values[1].id > values[2].name > ... > > for the parameters interceptor to work properly when applying the posted > values. > > See here for more details: > http://struts.apache.org/2.1.8/docs/tabular-inputs.html > > - René > > bruno grandjean schrieb: > > Dear Rene, > > > > Thks a lot for replying to me because I am feeling a little bit alone with > > my CRUD ;-). In fact I am trying to build a dynamic MetaCrud. > > My pb is simple: in the same jsp page I would like to update a Parent > > object > > and its Childs (values): > > > > <s:form action="saveOrUpdateParent"> > > <s:push value="parent"> > > <s:hidden name="id" /> <s:textfield > > name="name" label="Nom" /> > > <s:push value="values"> > > <s:iterator id="p" value="values"> > > <s:textfield label="Nom" name="#name" value="%{name}"/> > > </s:iterator> > > </s:push> > > <s:submit /> > > </s:push> > > </s:form> > > > > From an existing Parent object with many Childs objects I can easily modify > > parent.name for instance but the collection of Child objects (values) is > > always empty in the ParentAction (saveOrUpdate() method) after submitting. > > However I can display each values[i].name in the jsp page with the correct > > value. > > So it is not an issue with Hibernate but with the jsp or ModelDriven > > interface I don't know..Do you have any idea? > > Basically I was not able to find a struts or spring documentation about > > CRUD > > & association between two entities on the same jsp page. > > best regards > > bruno > > > > > > > > -------------------------------------------------- > > From: "Rene Gielen" <gie...@it-neering.net> > > Sent: Wednesday, March 31, 2010 7:12 PM > > To: "Struts Users Mailing List" <user@struts.apache.org> > > Subject: Re: CRUD with a OneToMany association under Struts 2 / Hibernate 3 > > > >> I'm not sure if I understand what your actual question is, nor whether > >> it is particularly Struts 2 related (rather than just Hibernate) - but > >> you might want to have a look in the CRUD demo section of the Struts 2 > >> showcase application. Maybe you will also find this demo useful: > >> http://github.com/rgielen/struts2crudevolutiondemo > >> > >> - René > >> > >> bruno grandjean schrieb: > >>> Hi > >>> > >>> I am trying to implement a simple CRUD with a OneToMany association > >>> under Struts 2 / Hibernate 3. > >>> I have two entities Parent and Child: > >>> > >>> @Entity > >>> @Table(name="PARENT") > >>> public class Parent { > >>> private Long id; > >>> private Set<Child> values = new HashSet<Child>(); > >>> .. > >>> @Entity > >>> @Table(name="CHILD") > >>> public class Child { > >>> private Long id; > >>> private String name; > >>> .. > >>> > >>> I can easily create, delete Parent or read the Child Set (values) but > >>> it is impossible to update Child Set. > >>> The jsp page (see below) reinit the values Set, no record after > >>> updating! > >>> Could u explain to me what's wrong? > >>> > >>> here are my code: > >>> > >>> @Entity > >>> @Table(name="PARENT") > >>> public class Parent { > >>> private Long id; > >>> private Set<Child> values = new HashSet<Child>(); > >>> @Id > >>> @GeneratedValue > >>> @Column(name="PARENT_ID") > >>> public Long getId() { > >>> return id; > >>> } > >>> public void setId(Long id) { > >>> this.id = id; > >>> } > >>> @ManyToMany(fetch = FetchType.EAGER) > >>> @JoinTable(name = "PARENT_CHILD", joinColumns = { @JoinColumn(name = > >>> "PARENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "CHILD_ID") }) > >>> public Set<Child> getValues() { > >>> return values; > >>> } > >>> public void setValues(Set<Child> lst) { > >>> values = lst; > >>> } > >>> } > >>> > >>> @Entity > >>> @Table(name="CHILD") > >>> public class Child { > >>> private Long id; > >>> private String name; > >>> @Id > >>> @GeneratedValue > >>> @Column(name="CHILD_ID") > >>> public Long getId() { > >>> return id; > >>> } > >>> public void setId(Long id) { > >>> this.id = id; > >>> } > >>> @Column(name="NAME") > >>> public String getName() { > >>> return name; > >>> } > >>> public void setName(String val) { > >>> name = val; > >>> } > >>> } > >>> > >>> public interface ParentDAO { > >>> public void saveOrUpdateParent(Parent cl); > >>> public void saveParent(Parent cl); > >>> public List<Parent> listParent(); > >>> public Parent listParentById(Long clId); > >>> public void deleteParent(Long clId); > >>> } > >>> > >>> public class ParentDAOImpl implements ParentDAO { > >>> @SessionTarget > >>> Session session; > >>> @TransactionTarget > >>> Transaction transaction; > >>> > >>> @Override > >>> public void saveOrUpdateParent(Parent cl) { > >>> try { > >>> session.saveOrUpdate(cl); > >>> } catch (Exception e) { > >>> transaction.rollback(); > >>> e.printStackTrace(); > >>> } > >>> } > >>> > >>> @Override > >>> public void saveParent(Parent cl) { > >>> try { > >>> session.save(cl); > >>> } catch (Exception e) { > >>> transaction.rollback(); > >>> e.printStackTrace(); > >>> } > >>> } > >>> > >>> @Override > >>> public void deleteParent(Long clId) { > >>> try { > >>> Parent cl = (Parent) session.get(Parent.class, clId); > >>> session.delete(cl); > >>> } catch (Exception e) { > >>> transaction.rollback(); > >>> e.printStackTrace(); > >>> } > >>> } > >>> > >>> @SuppressWarnings("unchecked") > >>> @Override > >>> public List<Parent> listParent() { > >>> List<Parent> courses = null; > >>> try { > >>> courses = session.createQuery("from Parent").list(); > >>> } catch (Exception e) { > >>> e.printStackTrace(); > >>> } > >>> return courses; > >>> } > >>> > >>> @Override > >>> public Parent listParentById(Long clId) { > >>> Parent cl = null; > >>> try { > >>> cl = (Parent) session.get(Parent.class, clId); > >>> } catch (Exception e) { > >>> e.printStackTrace(); > >>> } > >>> return cl; > >>> } > >>> } > >>> > >>> public class ParentAction extends ActionSupport implements > >>> ModelDriven<Parent> { > >>> > >>> private static final long serialVersionUID = -2662966220408285700L; > >>> private Parent cl = new Parent(); > >>> private List<Parent> clList = new ArrayList<Parent>(); > >>> private ParentDAO clDAO = new ParentDAOImpl(); > >>> > >>> @Override > >>> public Parent getModel() { > >>> return cl; > >>> } > >>> > >>> public String saveOrUpdate() > >>> { > >>> clDAO.saveOrUpdateParent(cl); > >>> return SUCCESS; > >>> } > >>> > >>> public String save() > >>> { > >>> clDAO.saveParent(cl); > >>> return SUCCESS; > >>> } > >>> > >>> public String list() > >>> { > >>> clList = clDAO.listParent(); > >>> return SUCCESS; > >>> } > >>> > >>> public String delete() > >>> { > >>> HttpServletRequest request = (HttpServletRequest) > >>> ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); > >>> clDAO.deleteParent(Long.parseLong(request.getParameter("id"))); > >>> return SUCCESS; > >>> } > >>> > >>> public String edit() > >>> { > >>> HttpServletRequest request = (HttpServletRequest) > >>> ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); > >>> cl = clDAO.listParentById(Long.parseLong(request.getParameter("id"))); > >>> return SUCCESS; > >>> } > >>> > >>> public Parent getParent() { > >>> return cl; > >>> } > >>> > >>> public void setParent(Parent cl) { > >>> this.cl = cl; > >>> } > >>> > >>> public List<Parent> getParentList() { > >>> return clList; > >>> } > >>> > >>> public void setParentList(List<Parent> clList) { > >>> this.clList = clList; > >>> } > >>> } > >>> > >>> and finally the jsp page: > >>> > >>> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" > >>> pageEncoding="ISO-8859-1"%> > >>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > >>> "http://www.w3.org/TR/html4/loose.dtd"> > >>> <%...@taglib uri="/struts-tags" prefix="s"%> > >>> <html> > >>> <head> > >>> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> > >>> <title>Parent Registration Page</title> > >>> <s:head /> > >>> <style type="text/css"> > >>> @import url(style.css); > >>> </style> > >>> </head> > >>> <body> > >>> <s:form action="saveOrUpdateParent"> > >>> <s:push value="parent"> > >>> <s:hidden name="id" /> > >>> <s:push value="values"> > >>> <s:iterator id="p" value="values"> > >>> <s:textfield label="Nom" name="values(%{id}).name" value="%{name}"/> > >>> </s:iterator> > >>> </s:push> > >>> <s:submit /> > >>> </s:push> > >>> </s:form> > >>> > >>> <s:if test="parentList.size() > 0"> > >>> <div class="content"> > >>> <table class="userTable" cellpadding="5px"> > >>> <tr class="even"> > >>> <th>Child(s)</th> > >>> </tr> > >>> <s:iterator value="parentList" status="userStatus"> > >>> <tr > >>> class="<s:if test="#userStatus.odd == true > >>> ">odd</s:if><s:else>even</s:else>"> > >>> <td><s:property value="values.size()" /></td> > >>> <s:iterator value="values"> > >>> <td><s:property value="name" /></td> > >>> </s:iterator> > >>> <td><s:url id="editURL" action="editParent"> > >>> <s:param name="id" value="%{id}"></s:param> > >>> </s:url> <s:a href="%{editURL}">Edit</s:a></td> > >>> <td><s:url id="deleteURL" action="deleteParent"> > >>> <s:param name="id" value="%{id}"></s:param> > >>> </s:url> <s:a href="%{deleteURL}">Delete</s:a></td> > >>> </tr> > >>> </s:iterator> > >>> </table> > >>> </div> > >>> </s:if> > >>> </body> > >>> </html> > >>> > >> > >> -- > >> René Gielen > >> IT-Neering.net > >> Saarstrasse 100, 52062 Aachen, Germany > >> Tel: +49-(0)241-4010770 > >> Fax: +49-(0)241-4010771 > >> Cel: +49-(0)163-2844164 > >> http://twitter.com/rgielen > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org > >> For additional commands, e-mail: user-h...@struts.apache.org > >> > >> > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org > > For additional commands, e-mail: user-h...@struts.apache.org > > > > -- > René Gielen > IT-Neering.net > Saarstrasse 100, 52062 Aachen, Germany > Tel: +49-(0)241-4010770 > Fax: +49-(0)241-4010771 > Cel: +49-(0)163-2844164 > http://twitter.com/rgielen > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org > For additional commands, e-mail: user-h...@struts.apache.org > _________________________________________________________________ Découvrez comment SURFER DISCRETEMENT sur un site de rencontres ! http://clk.atdmt.com/FRM/go/206608211/direct/01/