I thought I had the answer when I discovered that another programmer on the
project had created an ApplicationPlace class! And while its ManyToMany
annotations were commented out, its Entity annotation was not, so I figured
Hibernate was getting confused and creating and/or populating the
applicationplace table more than once.

But no, it didn't fix it. I deleted the class, nuked the target directory
and rebuilt, and it's still not saving my Places with the Application, still
displaying duplicate Applications.

Ugh.
Bob


syg6 wrote:
> 
> 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#a12197359
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