Re: Duplicate objects in db4o with back button

2009-01-23 Thread pieter claassen
Igor, thanks for your comments so far.

After a lot of struggle, I now have the following strategy in place which
just provides me with the old results, duplicate data in the database when I
add a template, and then press the back button and add it again.

Here is an example of how I create a new object in wicket (when I need a
transient model). I am trying to understand how wicket gets/sets the
objects. Any pointers?

public class TemplateAddPage extends AuthPage {
public TemplateAddPage() {
setModel(new CompoundPropertyModel(new Template()));
add(new TemplateAddForm("templateaddform"));
}

@Override
public Role[] getAllowedRoles() {
return new Role[] { Role.ADMIN, Role.THERAPIST };
}

private class TemplateAddForm extends Form {
public TemplateAddForm(String id) {
super(id);
add(new RequiredTextField("name"));
add(new RequiredTextField("version"));
add(new RequiredTextField("author"));
add(new TextArea("description"));
add(new TemplateDropDownChoicePanel("ddcpanel"));
}

@Override
public void onSubmit() {
Template template = (Template) getInnermostModel().getObject();
WicketApplication.get().getTemplateFactory().store(template);
setResponsePage(new TemplateListPage());
}
}
}


And here is my base IModel class

public abstract class BaseWebModel implements IModel {

private static final long serialVersionUID = 1L;

protected Long id = null;
protected T object = null;

public abstract Class getBaseClass();

public abstract BaseFactory getFactory();

public BaseWebModel(T object) {
this.id = getFactory().getID(object);
this.object = object;
}

public T getObject() {
if (object == null) {
object = getFactory().getById(id);
if (object == null) {
throw new RuntimeException("Object not found");
}
}
return object;

}

public void setObject(Object object) {
getFactory().store((T) object);
}

public void detach() {
if (object != null) {
if (id != null) {
id = getFactory().getID(object);
object = null;
}
}
}




On Thu, Jan 22, 2009 at 7:58 PM, Igor Vaynberg wrote:

> when you click the back button you go to a previous version of the
> page (a snapshot as it existed when rendered). in that version the id
> inside the model is still null.
>
> -igor
>
> On Thu, Jan 22, 2009 at 10:48 AM, pieter claassen
>  wrote:
> > Thanks for both responses. I can see what I am supposed to do, what I
> don't
> > understand is what is going wrong.
> >
> > Why when I click on the back button, does the id of my object become
> > invalid? Any pointers in the wicket docs to understand this better?
> >
> > Regards,
> > Pieter
> >
> > BTW> Thanks for a great framework.
> >
> >
> > On Thu, Jan 22, 2009 at 5:44 PM, Igor Vaynberg  >wrote:
> >
> >> http://wicketinaction.com/2008/09/building-a-smart-entitymodel/
> >>
> >> notice the deatch() implementation
> >>
> >> -igor
> >>
> >> On Thu, Jan 22, 2009 at 8:05 AM, pieter claassen  >
> >> wrote:
> >> > I am using wicket 1.3.5 and db4o 7.4.63.11890.
> >> >
> >> > My objects are being passed between pages using a subclass of
> >> > LoadableDetachableModel (see below)
> >> >
> >> > My problem is:
> >> > 1. I edit an object on PageA
> >> > 2. I use the back button and then re-submit the form I edited and now
> I
> >> have
> >> > two objects in the database.
> >> >
> >> > Any ideas on why this is happening?
> >> >
> >> > Cheers,
> >> > Pieter
> >> >
> >> >
> >> > package com.musmato.wicket.model;
> >> >
> >> > import org.apache.wicket.model.LoadableDetachableModel;
> >> >
> >> > import com.musmato.dao.BaseFactory;
> >> >
> >> > public abstract class BaseWebModel extends LoadableDetachableModel
> {
> >> >
> >> >private static final long serialVersionUID = 1L;
> >> >
> >> >protected Long id;
> >> >
> >> >public abstract Class getBaseClass();
> >> >
> >> >public abstract BaseFactory getFactory();
> >> >
> >> >public BaseWebModel(Long id) {
> >> >this.id = id;
> >> >}
> >> >
> >> >public BaseWebModel(T object) {
> >> >this.id = getFactory().getID(object);
> >> >}
> >> >
> >> >@Override
> >> >protected Object load() {
> >> >
> >> >if (id == null) {
> >> >return getFactory().getNewObject();
> >> >}
> >> >
> >> >return getFactory().getById(id);
> >> >}
> >> >
> >> > }
> >> >
> >>
> >> -
> >> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> >> For additional commands, e-mail: users-h...@wicket.apache.org
> >>
> >>
> >
>


Re: Duplicate objects in db4o with back button

2009-01-22 Thread Igor Vaynberg
when you click the back button you go to a previous version of the
page (a snapshot as it existed when rendered). in that version the id
inside the model is still null.

-igor

On Thu, Jan 22, 2009 at 10:48 AM, pieter claassen
 wrote:
> Thanks for both responses. I can see what I am supposed to do, what I don't
> understand is what is going wrong.
>
> Why when I click on the back button, does the id of my object become
> invalid? Any pointers in the wicket docs to understand this better?
>
> Regards,
> Pieter
>
> BTW> Thanks for a great framework.
>
>
> On Thu, Jan 22, 2009 at 5:44 PM, Igor Vaynberg wrote:
>
>> http://wicketinaction.com/2008/09/building-a-smart-entitymodel/
>>
>> notice the deatch() implementation
>>
>> -igor
>>
>> On Thu, Jan 22, 2009 at 8:05 AM, pieter claassen 
>> wrote:
>> > I am using wicket 1.3.5 and db4o 7.4.63.11890.
>> >
>> > My objects are being passed between pages using a subclass of
>> > LoadableDetachableModel (see below)
>> >
>> > My problem is:
>> > 1. I edit an object on PageA
>> > 2. I use the back button and then re-submit the form I edited and now I
>> have
>> > two objects in the database.
>> >
>> > Any ideas on why this is happening?
>> >
>> > Cheers,
>> > Pieter
>> >
>> >
>> > package com.musmato.wicket.model;
>> >
>> > import org.apache.wicket.model.LoadableDetachableModel;
>> >
>> > import com.musmato.dao.BaseFactory;
>> >
>> > public abstract class BaseWebModel extends LoadableDetachableModel {
>> >
>> >private static final long serialVersionUID = 1L;
>> >
>> >protected Long id;
>> >
>> >public abstract Class getBaseClass();
>> >
>> >public abstract BaseFactory getFactory();
>> >
>> >public BaseWebModel(Long id) {
>> >this.id = id;
>> >}
>> >
>> >public BaseWebModel(T object) {
>> >this.id = getFactory().getID(object);
>> >}
>> >
>> >@Override
>> >protected Object load() {
>> >
>> >if (id == null) {
>> >return getFactory().getNewObject();
>> >}
>> >
>> >return getFactory().getById(id);
>> >}
>> >
>> > }
>> >
>>
>> -
>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>> For additional commands, e-mail: users-h...@wicket.apache.org
>>
>>
>

-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org



Re: Duplicate objects in db4o with back button

2009-01-22 Thread pieter claassen
Thanks for both responses. I can see what I am supposed to do, what I don't
understand is what is going wrong.

Why when I click on the back button, does the id of my object become
invalid? Any pointers in the wicket docs to understand this better?

Regards,
Pieter

BTW> Thanks for a great framework.


On Thu, Jan 22, 2009 at 5:44 PM, Igor Vaynberg wrote:

> http://wicketinaction.com/2008/09/building-a-smart-entitymodel/
>
> notice the deatch() implementation
>
> -igor
>
> On Thu, Jan 22, 2009 at 8:05 AM, pieter claassen 
> wrote:
> > I am using wicket 1.3.5 and db4o 7.4.63.11890.
> >
> > My objects are being passed between pages using a subclass of
> > LoadableDetachableModel (see below)
> >
> > My problem is:
> > 1. I edit an object on PageA
> > 2. I use the back button and then re-submit the form I edited and now I
> have
> > two objects in the database.
> >
> > Any ideas on why this is happening?
> >
> > Cheers,
> > Pieter
> >
> >
> > package com.musmato.wicket.model;
> >
> > import org.apache.wicket.model.LoadableDetachableModel;
> >
> > import com.musmato.dao.BaseFactory;
> >
> > public abstract class BaseWebModel extends LoadableDetachableModel {
> >
> >private static final long serialVersionUID = 1L;
> >
> >protected Long id;
> >
> >public abstract Class getBaseClass();
> >
> >public abstract BaseFactory getFactory();
> >
> >public BaseWebModel(Long id) {
> >this.id = id;
> >}
> >
> >public BaseWebModel(T object) {
> >this.id = getFactory().getID(object);
> >}
> >
> >@Override
> >protected Object load() {
> >
> >if (id == null) {
> >return getFactory().getNewObject();
> >}
> >
> >return getFactory().getById(id);
> >}
> >
> > }
> >
>
> -
> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> For additional commands, e-mail: users-h...@wicket.apache.org
>
>


Re: Duplicate objects in db4o with back button

2009-01-22 Thread Igor Vaynberg
http://wicketinaction.com/2008/09/building-a-smart-entitymodel/

notice the deatch() implementation

-igor

On Thu, Jan 22, 2009 at 8:05 AM, pieter claassen  wrote:
> I am using wicket 1.3.5 and db4o 7.4.63.11890.
>
> My objects are being passed between pages using a subclass of
> LoadableDetachableModel (see below)
>
> My problem is:
> 1. I edit an object on PageA
> 2. I use the back button and then re-submit the form I edited and now I have
> two objects in the database.
>
> Any ideas on why this is happening?
>
> Cheers,
> Pieter
>
>
> package com.musmato.wicket.model;
>
> import org.apache.wicket.model.LoadableDetachableModel;
>
> import com.musmato.dao.BaseFactory;
>
> public abstract class BaseWebModel extends LoadableDetachableModel {
>
>private static final long serialVersionUID = 1L;
>
>protected Long id;
>
>public abstract Class getBaseClass();
>
>public abstract BaseFactory getFactory();
>
>public BaseWebModel(Long id) {
>this.id = id;
>}
>
>public BaseWebModel(T object) {
>this.id = getFactory().getID(object);
>}
>
>@Override
>protected Object load() {
>
>if (id == null) {
>return getFactory().getNewObject();
>}
>
>return getFactory().getById(id);
>}
>
> }
>

-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org



Re: Duplicate objects in db4o with back button

2009-01-22 Thread Martijn Dashorst
when you save the entity, make sure you update the ID in the LDM to
point to the newly created object.

Martijn

On Thu, Jan 22, 2009 at 5:05 PM, pieter claassen  wrote:
> I am using wicket 1.3.5 and db4o 7.4.63.11890.
>
> My objects are being passed between pages using a subclass of
> LoadableDetachableModel (see below)
>
> My problem is:
> 1. I edit an object on PageA
> 2. I use the back button and then re-submit the form I edited and now I have
> two objects in the database.
>
> Any ideas on why this is happening?
>
> Cheers,
> Pieter
>
>
> package com.musmato.wicket.model;
>
> import org.apache.wicket.model.LoadableDetachableModel;
>
> import com.musmato.dao.BaseFactory;
>
> public abstract class BaseWebModel extends LoadableDetachableModel {
>
>private static final long serialVersionUID = 1L;
>
>protected Long id;
>
>public abstract Class getBaseClass();
>
>public abstract BaseFactory getFactory();
>
>public BaseWebModel(Long id) {
>this.id = id;
>}
>
>public BaseWebModel(T object) {
>this.id = getFactory().getID(object);
>}
>
>@Override
>protected Object load() {
>
>if (id == null) {
>return getFactory().getNewObject();
>}
>
>return getFactory().getById(id);
>}
>
> }
>



-- 
Become a Wicket expert, learn from the best: http://wicketinaction.com
Apache Wicket 1.3.5 is released
Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3.

-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org



Duplicate objects in db4o with back button

2009-01-22 Thread pieter claassen
I am using wicket 1.3.5 and db4o 7.4.63.11890.

My objects are being passed between pages using a subclass of
LoadableDetachableModel (see below)

My problem is:
1. I edit an object on PageA
2. I use the back button and then re-submit the form I edited and now I have
two objects in the database.

Any ideas on why this is happening?

Cheers,
Pieter


package com.musmato.wicket.model;

import org.apache.wicket.model.LoadableDetachableModel;

import com.musmato.dao.BaseFactory;

public abstract class BaseWebModel extends LoadableDetachableModel {

private static final long serialVersionUID = 1L;

protected Long id;

public abstract Class getBaseClass();

public abstract BaseFactory getFactory();

public BaseWebModel(Long id) {
this.id = id;
}

public BaseWebModel(T object) {
this.id = getFactory().getID(object);
}

@Override
protected Object load() {

if (id == null) {
return getFactory().getNewObject();
}

return getFactory().getById(id);
}

}