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] > >
