Howdy.

Did both of those things but it hasn't fixed either one of my problems. I
suspect that the lazyLoadingFilter would eliminate errors when you try to
access a Collection in a jsp without first initializing it, which might come
in handy.

But I still get duplicate and triplicate records in the list page, and
Hibernate is not updating my Places collection. :(

Any other ideas?

Bob


Mike Horwitz wrote:
> 
> O.K. To get rid of the problems in the page, uncomment the
> OpenSessionInView
> filter + filter mapping in your web.xml. To make it persist the
> relationship
> you need to add CascadeType.UPDATE to your list.
> 
> Mike.
> 
> On 8/16/07, syg6 <[EMAIL PROTECTED]> wrote:
>>
>>
>> Upon further reflection it seems I need a ManyToMany, not OneToMany.
>>
>> I changed my mappings accordingly:
>>
>> Application POJO
>>
>> private Set<Place> places;
>>
>> @ManyToMany(
>>      targetEntity=com.myco.myapp.model.Place.class,
>>      cascade={CascadeType.PERSIST, CascadeType.MERGE},
>>      fetch = FetchType.EAGER
>> )
>> @JoinTable(
>>      name="applicationplace",
>>      [EMAIL PROTECTED](name="idApplication")},
>>      [EMAIL PROTECTED](name="idPlace")}
>> )
>> public Set<Place> getPlaces(){
>>        return places;
>> }
>>
>> Place POJO
>>
>> private Set<Application> applications;
>>
>> @ManyToMany(
>> cascade={CascadeType.PERSIST, CascadeType.MERGE},
>> mappedBy="places",
>> targetEntity=Application.class
>> )
>> public Set<Application> getApplications() {
>> return applications;
>> }
>>
>> But the same thing is happening - The list page shows an Application for
>> every Place associated, and when I save it doesn't update the associated
>> Places. Bummer. Interestingly, if I omit the fetch=FetchType.EAGER, I get
>> the proper number of Applications in the list page. But the edit page
>> dies,
>> saying that places is null.
>>
>> I got this mapping straight out of the Hibernate reference manual. I'm
>> not
>> sure what I am doing wrong ...
>>
>> Bob
>>
>>
>> syg6 wrote:
>> >
>> > 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#a12180898
>> 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#a12194965
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