I believe you could resolve both cases by registering custom editors in your
controllers - this would allow Spring MVC to automatically convert between
the object and its string representation. See the thread on this discussion
for more details http://tinyurl.com/3yghfd:

You are going to need to provide *Spring* *MVC* with a way to get from an id
to a country and vice-versa.  As you correctly point out this is done by
registering a custom property editor in your controller. To do this you need
to:

1) Extend the class *PropertyEditorSupport* to create the property editor:
http://java.sun.com/j2se/1.5.0/docs/api/java/beans/*PropertyEditorSupport*.html
<http://java.sun.com/j2se/1.5.0/docs/api/java/beans/PropertyEditorSupport.html>

You need to override the getAsText() and setAsText() methods. The first
should call getValue() and return the id as text, and the second should
accept a text id and call setValue() on the editor with the corresponding
country object.

2) You then register this custom editor using one of the appropriate methods
on your controller: initBinder() see api on http://tinyurl.com/2sutrm

And it should all work like magic....

Mike.


On 10/2/07, syg6 <[EMAIL PROTECTED]> wrote:
>
>
> I have a couple scenarios, one typical the other not so much, that I am
> trying to implement as quickly and easily as possible.
>
> The first is pretty straight-forward:
>
> @Entity
> public class Application
> ...
> private StreetSection streetSecion;
> ...
> @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
> @JoinColumn(name="streetSection", nullable=false)
> public StreetSection getStreetSection()
> {
> return streetSection;
> }
>
> In my form, which is the correct way to do the input?
>
> <form:hidden path="streetSection" id="streetSection" />
>
> or
>
> <form:hidden path="streetSection.id" id="streetSection.id" />
>
> In my testing I have found that they both work but each one has its own
> little quirks. For example, if I use 'streetSection.id', when it's a new
> Application the page crashes because streetSection.id is null. So I have
> to
> put a <c:if> in there and if it's null just use a normal <input
> type='hidden'> tag.
>
> If I use 'streetSection' I believe (I've done so many tests I forget ...)
> that Hibernate is giving me 'can't save transient object' errors. Anyway,
> just curious what the best practice is.
>
> The other scenario is more complicated. I have an object, Establishment,
> and
> another, Container, and they both have a list of EstablishmentContainer
> objects, which saved in a join table that has an attribute, quantity. So
> each POJO, Establishment and Container, have a OneToMany relationship with
> EstablishmentContainer, and EstablishmentContainer has a ManyToOne
> relationship with both Establishment and Container. This is apparently the
> best way to map join tables with attributes.
>
> @Entity
> public class Establishment
> ...
> private List<EstablishmentContainers> establishmentContainers;
> ...
> @OneToMany(mappedBy="establishment", fetch = FetchType.EAGER, cascade = {
> CascadeType.PERSIST, CascadeType.MERGE })
> public List<EstablishmentContainer> getEstablishmentContainers()
> {
> return establishmentContainer;
> }
>
> @Entity
> public class Container
> ...
> @OneToMany(mappedBy="container")
> public List<EstablishmentContainer> getEstablishmentContainers ()
> {
> return establishmentContainers;
> }
>
> @Entity
> public class EstablishmentContainer extends
> {
>        private Long id;
>        private Establishment establishment;
>        private Container container;
>
>        private int quantity;
> ...
> @ManyToOne
> @JoinColumn(name="idEstablishment")
> public Establishment getEstablishment()
> {
> return establishment;
> }
>
> @ManyToOne
> @JoinColumn(name="idContainer")
> public Cubo getContainer()
> {
> return container;
> }
>
> @Column(name="quantity")
> public int getQuantity()
> {
> return quantity;
> }
>
> In my EstablishmentFormController do I have to do the following for each
> EstablishmentContainer created in the page:
>
> 1. instantiate an EstablishmentContainer object
> 2. fill it it request parameters by hand
> 3. add it to a List
> 4. assign that list to my Establishment object
>
> ... for the EstablishmentContainers list to be properly saved when I do an
> establishmentManager.save()?
> This is what I am doing currently and it works but it seems to me that if
> I
> put the following in my jsp:
>
> input type="text" id="establishmentContainers.container.id"
> input type="text" id="establishmentContainers.establihsment.id"
> input type="text" id="establishmentContainers.quantity"
>
> Spring should be able to populate the List of EstablishmentObjects
> automatically, just as in the first example it populates my
> Application.StreetSection object when I put a
>
> input type="text" id="application.streetSection"
>
> element in the page. If it's not possible I can keep doing it the way I
> currently do, I just don't want to reinvent the wheel.
>
> Sorry for the long post. I look forward to any and all responses.
> Bob
>
> --
> View this message in context:
> http://www.nabble.com/Best-way-to-save-ManyToOne-relationships-with-Hibernate-and-Spring-MVC-tf4553758s2369.html#a12995187
> Sent from the AppFuse - User mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

Reply via email to