You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Ryan Beckes <rb...@gmail.com> on 2010/10/12 20:21:57 UTC

Setting associated objects for the current model

Hello,

I'm using an action which implements the ModelDriven interface where my
model is a hibernate POJO (e.g. Customer). In this Customer I have a
OneToMany relationship with another hibernate POJO (e.g. Address)...

    /** persistent field */
    @OneToMany(mappedBy="customer",
targetEntity=com.inftropy.plus.account.Customer.model.Address.class, cascade
= { CascadeType.ALL}, fetch=FetchType.EAGER)
    @IndexedEmbedded
    private Set<Address> addresses;

... I'm trying to create a form that allows the setting for multiple
addresses for the current customer. For example, say my address has two
fields (id and name) and I want to set two addresses for a certain
Customer....

BEGIN jsp
<s:iterator value="model" status="customerStatus" id="customer">
        <table>
          <tr>
            <td>
              <s:text name="addressIdTitle"/>
            </td>
            <s:iterator value="#attr.customer.addresses"
status="custAddressStatus">
            <td>
              <s:textfield name="addresses.id" value="%{id}"/>
            </td>
            </s:iterator>
          </tr>
          <tr>
            <td>
              <s:text name="addressCodeTitle"/>
            </td>
            <s:iterator value="#attr.customer.addresses"
status="custAddressStatus">
            <td>
              <s:textfield name="addresses.code" value="%{code}"/>
            </td>
            </s:iterator>
          </tr>
</s:iterator>
END jsp

BEGIN resulting html

        <table>
          <tr>
            <td>
              addressIdTitle
            </td>


            <td>
              <input type="text" name="addresses.id" value="2"
id="Customer_update_addresses_id"/>
            </td>

            <td>
              <input type="text" name="addresses.id" value="1"
id="Customer_update_addresses_id"/>
            </td>

          </tr>
          <tr>
            <td>

              addressCodeTitle
            </td>

            <td>
              <input type="text" name="addresses.code" value="SHIPTO"
id="Customer_update_addresses_code"/>
            </td>

            <td>
              <input type="text" name="addresses.code" value="BILLTO"
id="Customer_update_addresses_code"/>
            </td>
          </tr>
       </table>
END resulting html

... Is there a convention I can use (in this case I tried
addresses.<field>, which didn't work) so that the fields I set
correspond to the associated Address object for the current model?

Thanks,
Ryan

Re: Setting associated objects for the current model

Posted by Dave Newton <da...@gmail.com>.
Glad you worked it out :)

Dave

On Wed, Oct 13, 2010 at 4:30 PM, Ryan Beckes <rb...@gmail.com> wrote:

> Dave,
>
> Thanks for the tip, it worked perfectly! To recap, I changed the addresses
> mapping....
>
>    /** persistent field */
>    @OneToMany(mappedBy="customer",
> targetEntity=com.inftropy.plus.account.Customer.model.Address.class,
> cascade
> = { CascadeType.ALL}, fetch=FetchType.EAGER)
>    @IndexedEmbedded
>     @MapKey(name="id")
>    private Map<java.lang.Long, Address> addresses;
>
> ... and the jsp...
>
>        <table>
>          <tr>
>            <td>
>              <s:text name="addressIdTitle"/>
>            </td>
>            <s:iterator value="#attr.customer.addresses"
> status="custAddressStatus">
>            <td>
>               <s:textfield name="addresses[%{key}].id" value="%{value.id
> }"/>
>             </td>
>            </s:iterator>
>          </tr>
>          <tr>
>            <td>
>              <s:text name="addressCodeTitle"/>
>            </td>
>            <s:iterator value="#attr.customer.addresses"
> status="custAddressStatus">
>            <td>
>               <s:textfield name="addresses[%{key}].code"
> value="%{value.code}"/>
>            </td>
>            </s:iterator>
>          </tr>
>        </table>
>
>
> Best,
> Ryan
>
>
> On Tue, Oct 12, 2010 at 1:26 PM, Dave Newton <da...@gmail.com>
> wrote:
>
> > I don't know about sets; personally I'd use a map so you actually have a
> > way
> > to access them by something meaningful, like an ID. Then you use
> map-based
> > property field names (it's [] or (), with the key inside, I forget which
> > off
> > the top of my head). I think () is for indexed, so I'd aim for [] first.
> >
> > Dave
> >
> > On Tue, Oct 12, 2010 at 2:21 PM, Ryan Beckes <rb...@gmail.com> wrote:
> >
> > > Hello,
> > >
> > > I'm using an action which implements the ModelDriven interface where my
> > > model is a hibernate POJO (e.g. Customer). In this Customer I have a
> > > OneToMany relationship with another hibernate POJO (e.g. Address)...
> > >
> > >    /** persistent field */
> > >    @OneToMany(mappedBy="customer",
> > > targetEntity=com.inftropy.plus.account.Customer.model.Address.class,
> > > cascade
> > > = { CascadeType.ALL}, fetch=FetchType.EAGER)
> > >    @IndexedEmbedded
> > >    private Set<Address> addresses;
> > >
> > > ... I'm trying to create a form that allows the setting for multiple
> > > addresses for the current customer. For example, say my address has two
> > > fields (id and name) and I want to set two addresses for a certain
> > > Customer....
> > >
> > > BEGIN jsp
> > > <s:iterator value="model" status="customerStatus" id="customer">
> > >        <table>
> > >          <tr>
> > >            <td>
> > >              <s:text name="addressIdTitle"/>
> > >            </td>
> > >            <s:iterator value="#attr.customer.addresses"
> > > status="custAddressStatus">
> > >            <td>
> > >              <s:textfield name="addresses.id" value="%{id}"/>
> > >            </td>
> > >            </s:iterator>
> > >          </tr>
> > >          <tr>
> > >            <td>
> > >              <s:text name="addressCodeTitle"/>
> > >            </td>
> > >            <s:iterator value="#attr.customer.addresses"
> > > status="custAddressStatus">
> > >            <td>
> > >              <s:textfield name="addresses.code" value="%{code}"/>
> > >            </td>
> > >            </s:iterator>
> > >          </tr>
> > > </s:iterator>
> > > END jsp
> > >
> > > BEGIN resulting html
> > >
> > >        <table>
> > >          <tr>
> > >            <td>
> > >              addressIdTitle
> > >            </td>
> > >
> > >
> > >            <td>
> > >              <input type="text" name="addresses.id" value="2"
> > > id="Customer_update_addresses_id"/>
> > >            </td>
> > >
> > >            <td>
> > >              <input type="text" name="addresses.id" value="1"
> > > id="Customer_update_addresses_id"/>
> > >            </td>
> > >
> > >          </tr>
> > >          <tr>
> > >            <td>
> > >
> > >              addressCodeTitle
> > >            </td>
> > >
> > >            <td>
> > >              <input type="text" name="addresses.code" value="SHIPTO"
> > > id="Customer_update_addresses_code"/>
> > >            </td>
> > >
> > >            <td>
> > >              <input type="text" name="addresses.code" value="BILLTO"
> > > id="Customer_update_addresses_code"/>
> > >            </td>
> > >          </tr>
> > >       </table>
> > > END resulting html
> > >
> > > ... Is there a convention I can use (in this case I tried
> > > addresses.<field>, which didn't work) so that the fields I set
> > > correspond to the associated Address object for the current model?
> > >
> > > Thanks,
> > > Ryan
> > >
> >
>

Re: Setting associated objects for the current model

Posted by Ryan Beckes <rb...@gmail.com>.
Dave,

Thanks for the tip, it worked perfectly! To recap, I changed the addresses
mapping....

    /** persistent field */
    @OneToMany(mappedBy="customer",
targetEntity=com.inftropy.plus.account.Customer.model.Address.class, cascade
= { CascadeType.ALL}, fetch=FetchType.EAGER)
    @IndexedEmbedded
    @MapKey(name="id")
    private Map<java.lang.Long, Address> addresses;

... and the jsp...

        <table>
          <tr>
            <td>
              <s:text name="addressIdTitle"/>
            </td>
            <s:iterator value="#attr.customer.addresses"
status="custAddressStatus">
            <td>
              <s:textfield name="addresses[%{key}].id" value="%{value.id}"/>
            </td>
            </s:iterator>
          </tr>
          <tr>
            <td>
              <s:text name="addressCodeTitle"/>
            </td>
            <s:iterator value="#attr.customer.addresses"
status="custAddressStatus">
            <td>
              <s:textfield name="addresses[%{key}].code"
value="%{value.code}"/>
            </td>
            </s:iterator>
          </tr>
        </table>


Best,
Ryan


On Tue, Oct 12, 2010 at 1:26 PM, Dave Newton <da...@gmail.com> wrote:

> I don't know about sets; personally I'd use a map so you actually have a
> way
> to access them by something meaningful, like an ID. Then you use map-based
> property field names (it's [] or (), with the key inside, I forget which
> off
> the top of my head). I think () is for indexed, so I'd aim for [] first.
>
> Dave
>
> On Tue, Oct 12, 2010 at 2:21 PM, Ryan Beckes <rb...@gmail.com> wrote:
>
> > Hello,
> >
> > I'm using an action which implements the ModelDriven interface where my
> > model is a hibernate POJO (e.g. Customer). In this Customer I have a
> > OneToMany relationship with another hibernate POJO (e.g. Address)...
> >
> >    /** persistent field */
> >    @OneToMany(mappedBy="customer",
> > targetEntity=com.inftropy.plus.account.Customer.model.Address.class,
> > cascade
> > = { CascadeType.ALL}, fetch=FetchType.EAGER)
> >    @IndexedEmbedded
> >    private Set<Address> addresses;
> >
> > ... I'm trying to create a form that allows the setting for multiple
> > addresses for the current customer. For example, say my address has two
> > fields (id and name) and I want to set two addresses for a certain
> > Customer....
> >
> > BEGIN jsp
> > <s:iterator value="model" status="customerStatus" id="customer">
> >        <table>
> >          <tr>
> >            <td>
> >              <s:text name="addressIdTitle"/>
> >            </td>
> >            <s:iterator value="#attr.customer.addresses"
> > status="custAddressStatus">
> >            <td>
> >              <s:textfield name="addresses.id" value="%{id}"/>
> >            </td>
> >            </s:iterator>
> >          </tr>
> >          <tr>
> >            <td>
> >              <s:text name="addressCodeTitle"/>
> >            </td>
> >            <s:iterator value="#attr.customer.addresses"
> > status="custAddressStatus">
> >            <td>
> >              <s:textfield name="addresses.code" value="%{code}"/>
> >            </td>
> >            </s:iterator>
> >          </tr>
> > </s:iterator>
> > END jsp
> >
> > BEGIN resulting html
> >
> >        <table>
> >          <tr>
> >            <td>
> >              addressIdTitle
> >            </td>
> >
> >
> >            <td>
> >              <input type="text" name="addresses.id" value="2"
> > id="Customer_update_addresses_id"/>
> >            </td>
> >
> >            <td>
> >              <input type="text" name="addresses.id" value="1"
> > id="Customer_update_addresses_id"/>
> >            </td>
> >
> >          </tr>
> >          <tr>
> >            <td>
> >
> >              addressCodeTitle
> >            </td>
> >
> >            <td>
> >              <input type="text" name="addresses.code" value="SHIPTO"
> > id="Customer_update_addresses_code"/>
> >            </td>
> >
> >            <td>
> >              <input type="text" name="addresses.code" value="BILLTO"
> > id="Customer_update_addresses_code"/>
> >            </td>
> >          </tr>
> >       </table>
> > END resulting html
> >
> > ... Is there a convention I can use (in this case I tried
> > addresses.<field>, which didn't work) so that the fields I set
> > correspond to the associated Address object for the current model?
> >
> > Thanks,
> > Ryan
> >
>

Re: Setting associated objects for the current model

Posted by Dave Newton <da...@gmail.com>.
I don't know about sets; personally I'd use a map so you actually have a way
to access them by something meaningful, like an ID. Then you use map-based
property field names (it's [] or (), with the key inside, I forget which off
the top of my head). I think () is for indexed, so I'd aim for [] first.

Dave

On Tue, Oct 12, 2010 at 2:21 PM, Ryan Beckes <rb...@gmail.com> wrote:

> Hello,
>
> I'm using an action which implements the ModelDriven interface where my
> model is a hibernate POJO (e.g. Customer). In this Customer I have a
> OneToMany relationship with another hibernate POJO (e.g. Address)...
>
>    /** persistent field */
>    @OneToMany(mappedBy="customer",
> targetEntity=com.inftropy.plus.account.Customer.model.Address.class,
> cascade
> = { CascadeType.ALL}, fetch=FetchType.EAGER)
>    @IndexedEmbedded
>    private Set<Address> addresses;
>
> ... I'm trying to create a form that allows the setting for multiple
> addresses for the current customer. For example, say my address has two
> fields (id and name) and I want to set two addresses for a certain
> Customer....
>
> BEGIN jsp
> <s:iterator value="model" status="customerStatus" id="customer">
>        <table>
>          <tr>
>            <td>
>              <s:text name="addressIdTitle"/>
>            </td>
>            <s:iterator value="#attr.customer.addresses"
> status="custAddressStatus">
>            <td>
>              <s:textfield name="addresses.id" value="%{id}"/>
>            </td>
>            </s:iterator>
>          </tr>
>          <tr>
>            <td>
>              <s:text name="addressCodeTitle"/>
>            </td>
>            <s:iterator value="#attr.customer.addresses"
> status="custAddressStatus">
>            <td>
>              <s:textfield name="addresses.code" value="%{code}"/>
>            </td>
>            </s:iterator>
>          </tr>
> </s:iterator>
> END jsp
>
> BEGIN resulting html
>
>        <table>
>          <tr>
>            <td>
>              addressIdTitle
>            </td>
>
>
>            <td>
>              <input type="text" name="addresses.id" value="2"
> id="Customer_update_addresses_id"/>
>            </td>
>
>            <td>
>              <input type="text" name="addresses.id" value="1"
> id="Customer_update_addresses_id"/>
>            </td>
>
>          </tr>
>          <tr>
>            <td>
>
>              addressCodeTitle
>            </td>
>
>            <td>
>              <input type="text" name="addresses.code" value="SHIPTO"
> id="Customer_update_addresses_code"/>
>            </td>
>
>            <td>
>              <input type="text" name="addresses.code" value="BILLTO"
> id="Customer_update_addresses_code"/>
>            </td>
>          </tr>
>       </table>
> END resulting html
>
> ... Is there a convention I can use (in this case I tried
> addresses.<field>, which didn't work) so that the fields I set
> correspond to the associated Address object for the current model?
>
> Thanks,
> Ryan
>