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]