Well, that of course worked - as I wrote earlier I'm very grateful.
Thank you very much for your help once again.
igor.vaynberg wrote:
>
> final Room r = (Room) m.getObject();
> item.add(new TextField("costPerNight",
> new PropertyModel(r,
> "costPerNight")));
>
> there you are binding your model directly to the object thus keeping a
> reference, instead
> new propertymodel(m, "costPerNight");
>
> -igor
>
> On Sun, Nov 30, 2008 at 3:51 PM, blekit <[EMAIL PROTECTED]> wrote:
>>
>> Hello,
>>
>> thanks for link to the article - it was very interesting. However, I
>> still
>> don't see clear connection between this case and my problem - I use my
>> own
>> DomainObjectModel which extends LoadableDetachableModel (and after
>> reading
>> once more the section about them i still can't see any mistakes in mine
>> usage of them - maybe i need some sleep after all).
>>
>> I think i noticed where the problem lies, but still I don't have any clue
>> how to fix it. The hotel's data including rooms list are loaded correctly
>> and rendered on the first time. But when i submit the form, only hotel's
>> direct data (name, address, etc.) are updated. I discovered, that the
>> list
>> of rooms i use as a model for my PageableListView is probably detached
>> immidiately after render and the changes made on her aren't propagated to
>> hotel when i persist it. Still, as I said before, I don't know why it
>> happens and I'd be very grateful for some more explicite answer.
>>
>> Thanks in advance.
>> Best regards,
>> Michał Olejnik
>>
>> PS. If you need some more code to help me let me know and i'll paste it
>>
>> igor.vaynberg wrote:
>>>
>>> go to wicketinaction.com and search for "smart entity model"
>>>
>>> also read the wiki page called models, especially detachable models
>>> secton.
>>>
>>> -igor
>>>
>>> On Sun, Nov 30, 2008 at 2:40 PM, blekit <[EMAIL PROTECTED]> wrote:
>>>>
>>>> Hello,
>>>>
>>>> I'm writing an web application using Spring, Wicket and Hibernate. It's
>>>> the
>>>> first time I use this technologies, so forgive me if my question is
>>>> trivial.
>>>>
>>>> In my application i have a many to one relationship between Hotel and
>>>> Room.
>>>> On admin panel I'd like to have possibility to edit Hotel data -
>>>> including
>>>> modifying data of rooms that belong to this hotel. Unfortunately, when
>>>> i
>>>> try
>>>> to save modified hotel, only it's data are changed - rooms stay they
>>>> were
>>>> before modification. And when i try to delete a room, i get an
>>>> exception
>>>> that says i try to delete detached entity
>>>> (java.lang.IllegalArgumentException: Removing a detached instance
>>>> pl.molejnik.hotbookings.model.Room#1).
>>>>
>>>> I've spent whole day looking for solutions for this, but I failed...
>>>> I'd
>>>> be
>>>> very grateful if anyone could tell me what i am doing wrong.
>>>>
>>>> Here are relevant fragments of my code:
>>>>
>>>> Room.java:
>>>>
>>>> @ManyToOne(targetEntity = Hotel.class)
>>>> @JoinColumn(name = "Hotel_id")
>>>> private Hotel hotel;
>>>>
>>>> Hotel.java
>>>>
>>>> @OneToMany(mappedBy = "hotel", cascade = { CascadeType.PERSIST,
>>>> CascadeType.MERGE, CascadeType.REMOVE })
>>>> private List<Room> rooms;
>>>>
>>>> DomainObjectModel
>>>>
>>>> public class DomainObjectModel<T extends DomainObject> extends
>>>> LoadableDetachableModel
>>>> {
>>>>
>>>> @SpringBean
>>>> private IHotelbookingsService service;
>>>>
>>>> private final Class<T> type;
>>>>
>>>> private final Long id;
>>>>
>>>> public DomainObjectModel(Class<T> type, Long id) {
>>>> InjectorHolder.getInjector().inject(this);
>>>> this.type = type;
>>>> this.id = id;
>>>> }
>>>>
>>>> @SuppressWarnings("unchecked")
>>>> public DomainObjectModel(T domainObject)
>>>> {
>>>> super(domainObject);
>>>> InjectorHolder.getInjector().inject(this);
>>>> this.type = (Class<T>) domainObject.getClass();
>>>> this.id = domainObject.getId();
>>>> }
>>>>
>>>> @Override
>>>> protected Object load() {
>>>> return service.load(type, id);
>>>> }
>>>>
>>>> }
>>>>
>>>> EditHotelPanel.java
>>>>
>>>> public class EditHotelPanel extends Panel
>>>> {
>>>>
>>>> private IModel model;
>>>>
>>>> private Form form;
>>>>
>>>> PageableListView rooms;
>>>>
>>>> @SpringBean
>>>> IHotelbookingsService service;
>>>>
>>>> public EditHotelPanel(String id, Long hotelId) {
>>>> super(id);
>>>> this.setOutputMarkupId(true);
>>>> model = new CompoundPropertyModel(new
>>>> DomainObjectModel<Hotel>(Hotel.class,
>>>> hotelId));
>>>> setModel(model);
>>>> form = new Form("form");
>>>> form.setOutputMarkupId(true);
>>>> form.add(new TextField("name"));
>>>> form.add(new TextField("numberOfStars"));
>>>> form.add(new TextField("address.city"));
>>>>
>>>> rooms = new PageableListView("rooms",
>>>> ((Hotel)model.getObject()).getRooms(), 10) {
>>>>
>>>>
>>>> @Override
>>>> protected void populateItem(ListItem item) {
>>>> DomainObjectModel<Room> m = new
>>>> DomainObjectModel<Room>((Room)
>>>> item.getModelObject());
>>>> final Room r = (Room) m.getObject();
>>>> item.add(new TextField("costPerNight",
>>>> new
>>>> PropertyModel(r,
>>>> "costPerNight")));
>>>> item.add(new TextField("numberOfBeds",
>>>> new
>>>> PropertyModel(r,
>>>> "numberOfBeds")));
>>>> item.add(new CheckBox("ensuite",
>>>> new PropertyModel(r,
>>>> "ensuite")));
>>>> item.add(new Link("deleteRoom"){
>>>>
>>>> @Override
>>>> public void onClick() {
>>>> service.removeRoom(r);
>>>> }
>>>>
>>>> });
>>>> }
>>>> };
>>>> form.add(rooms);
>>>>
>>>> SubmitLink save = new SubmitLink("saveButton") {
>>>>
>>>> @Override
>>>> public void onSubmit() {
>>>> Hotel h = (Hotel)model.getObject();
>>>> service.saveHotel(h);
>>>> setResponsePage(Index.class);
>>>> }
>>>>
>>>> };
>>>> form.add(save);
>>>> add(form);
>>>> }
>>>>
>>>> }
>>>>
>>>> EditHotelPanel.html
>>>>
>>>> <html xmlns:wicket>
>>>> <body>
>>>> <wicket:panel>
>>>> <form wicket:id="form">
>>>> Nazwa: <input type="text" wicket:id="name"/>
>>>> <br/>
>>>> Liczba gwiazdek: <input type="text"
>>>> wicket:id="numberOfStars"/>
>>>> <br/>
>>>> Miasto: <input type="text" wicket:id="address.city"/>
>>>> <br/>
>>>> <div>
>>>> Pokoje:
>>>> <br/>
>>>> <div>
>>>> Liczba miejsc
>>>> Cena
>>>> Lazienka
>>>> </div>
>>>> <div wicket:id="rooms">
>>>> <input type="text" wicket:id="numberOfBeds"/>
>>>> <input type="text"
>>>> wicket:id="costPerNight"/>
>>>> <input type="checkbox"
>>>> wicket:id="ensuite"/>
>>>> # Usuń
>>>> </div>
>>>> </div>
>>>> <input type="submit" value="Zapisz"
>>>> wicket:id="saveButton"/>
>>>> </form>
>>>> </wicket:panel>
>>>> </body>
>>>> </html>
>>>>
>>>> Best regards,
>>>> Michał Olejnik
>>>>
>>>>
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/Problem-with-detaching-elements-tp20763305p20763305.html
>>>> Sent from the Wicket - 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/Problem-with-detaching-elements-tp20763305p20763953.html
>> Sent from the Wicket - 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/Problem-with-detaching-elements-tp20763305p20764142.html
Sent from the Wicket - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]