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/

Reply via email to