I do have a hidden 'id' field, and I haven't specified a cascade type. 

Mind you, when I save an Application it is NOT saving an additional
Application in the database nor is it saving an additional record in the
applicationplace table. It is performing an UPDATE in the application table
and seemingly doing nothing in the applicationplace table. 

It seems that Hibernate is messing up the loading of the data (through some
mapping mess-up on my part, no doubt). When I call
applicationManager.getAll(), for a given Application A it is displaying (A x
numP), where numP is the number of Places associated with the Application.
It's as if it were performing a JOIN without specifying the correct FOREIGN
KEY field in both tables.

I'll keep digging ...

Bob


Michael Horwitz wrote:
> 
> Two things to check:
> 
> 1) You have a hidden field on your application form which stores the
> application id. If not there Hibernate will save a new application every
> time....
> 2) Cascade is set to at least "save-update" for the relationship to place.
> 
> Mike.
> 
> 
> On 8/16/07, syg6 <[EMAIL PROTECTED]> wrote:
>>
>>
>> Asnwered my own damn question, didn't I? That's what happens when you
>> spend
>> 20 minutes typing up a question for a mailing list ... :)
>>
>> What I was missing: in the initBinder() method, instead of
>>
>> binder.registerCustomEditor(Place.class, ppe);
>>
>> it should be:
>>
>> binder.registerCustomEditor(Place.class, "places", ppe);
>>
>> I guess if you don't specify which field of the Object you wish to bind
>> to,
>> it tries to bind to all of them, or the entire Object. Nope, that won't
>> work.
>>
>> Anyway, so it seems to be working in so much that if I choose 3 Places in
>> the multi-select, in my ApplicationController, after casting my command
>> Object:
>>
>> Application application = (Application) command;
>>
>> application.getPlaces() lists all 3. If I only select 2, it lists two.
>> BUT
>> it's not saving! All other fields get updated but not Places. The
>> applicationplaces table still has the data from the sample-data.xml.
>>
>> Something fishy is definitely going on because in my applicationlist.jsp,
>> If
>> I associate 2 Places with an Application (using sample-data.xml), that
>> Application shows up twice in the list of Applications. If I assign 3
>> Places, it shows up 3 times. Hmmm ...
>>
>> I already listed my mapping for Application. I don't have a mapping for
>> Place because I don't need to know which Application a Place is assigned
>> to.
>>
>> Is my mapping somehow wrong? Could that be messing up the save and the
>> list?
>>
>> Thanks,
>> Bob
>>
>>
>> syg6 wrote:
>> >
>> > Hello all.
>> >
>> > I am using Appfuse M5, Spring MVC + Hibernate. I have an object,
>> > Application, that as a 1-many relationship with Place. The Application
>> > Pojo looks like this:
>> >
>> > private Set<Place> places;
>> >
>> > @OneToMany (fetch = FetchType.EAGER)
>> > @JoinTable(
>> >   name="applicationplace",
>> >             joinColumns = { @JoinColumn( name="idApplication") },
>> >             inverseJoinColumns = @JoinColumn( name="idPlace")
>> >   )
>> >   public Set<Place> getPlaces(){
>> >       return places;
>> >   }
>> >
>> > In the database I have 3 tables:
>> >
>> > Application
>> > Place
>> > ApplicationPlace
>> >
>> > When I create a Application I can assign 0-n Places to that
>> Application.
>> > When I save the Application I have to use a Custom Property Editor to
>> tell
>> > Spring how to convert each id in the Places multiple-Select into a
>> Place
>> > object, so a reference to it can be saved in the ApplicationPlace
>> table.
>> >
>> > So far so good. I created a PlacePropertyEditor which looks like this:
>> >
>> > public class PlacePropertyEditor extends PropertyEditorSupport
>> > {
>> >   private GenericManager<Place, Long> placeManager = null;
>> >
>> >   public void setPlaceManager(GenericManager<Place, Long> placeManager)
>> {
>> >     this.placeManager = placeManager;
>> >   }
>> >
>> >   public void setAsText(String id) {
>> >       Place place = placeManager.get(new Long(id));
>> >       setValue(place);
>> >   }
>> > }
>> >
>> > In my ApplicationFormController I have a setPlaceManager() method and
>> it
>> > is properly wired in my dispatcher-servlet.xml. Also in
>> > ApplicationFormController I have overrided initBinder:
>> >
>> > protected void initBinder(HttpServletRequest request,
>> > ServletRequestDataBinder binder)
>> > {
>> >   PlacePropertyEditor ppe = new PlacePropertyEditor();
>> >   ppe.setPlaceManager(placeManager);
>> >   binder.registerCustomEditor(Place.class, ppe);
>> > }
>> >
>> > But when I run testSave() in ApplicationFormControllerTest it fails.
>> >
>> > public void testSave() throws Exception
>> > {
>> >   MockHttpServletRequest request = newGet("/applicationform.html");
>> >   request.addParameter("id", "1");
>> >
>> >   ModelAndView mv = c.handleRequest(request, new
>> > MockHttpServletResponse());
>> >
>> >   Application application = (Application)
>> > mv.getModel().get(c.getCommandName());
>> >   assertNotNull(application);
>> >
>> >   request = newPost("/applicationform.html");
>> >   super.objectToRequestParameters(application, request);
>> >   request.addParameter("applicationCode", "updated application code");
>> >
>> >   //request.addParameter("places", "1");
>> >
>> >   mv = c.handleRequest(request, new MockHttpServletResponse());
>> >
>> >   Errors errors = (Errors)
>> > mv.getModel().get(BindException.MODEL_KEY_PREFIX + "application");
>> >   assertNull(errors);
>> >   assertNotNull(request.getSession().getAttribute("successMessages"));
>> >  }
>> >
>> > The line that fails is assertNull(errors); If I comment out the Custom
>> > Property Editor it works. (But in the web page, without a Custom
>> Property
>> > Editor I get the typical error that I can't covert a Set to String) I
>> have
>> > tried adding request.addParameter("places", "1") to see if it was
>> failing
>> > because no idPlace was being sent in the request, but it fails either
>> way.
>> >
>> > It seems I am missing a step when defining my Custom Property Editor.
>> Do
>> I
>> > need to wire my PlacePropertyEditor in the application-context.xml?
>> > According to Chapter 5 of the Spring 2.0 Reference Manual I do. But I
>> > don't see that Appfuse does this with its Custom Property Editors;
>> > BaseFormController's initBinder() method registers Custom Property
>> Editors
>> > for Integer, Long, byte[] and Date but they aren't wired anywhere.
>> >
>> > I am not sure exactly what is failing. I've tried putting log.debug()
>> > statements in the code but they don't appear in the console or in my
>> > surefire reports.
>> >
>> > Anyone have an idea as to what I might be doing wrong?
>> >
>> > Thanks,
>> > Bob
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/testSave-fails-using-custom-property-editor-tf4278929s2369.html#a12179616
>> Sent from the AppFuse - User mailing list archive at Nabble.com.
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
> 
> 

-- 
View this message in context: 
http://www.nabble.com/testSave-fails-using-custom-property-editor-tf4278929s2369.html#a12179908
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