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]

Reply via email to