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 BaseWebModelT implements IModel {

private static final long serialVersionUID = 1L;

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

public abstract ClassT getBaseClass();

public abstract BaseFactoryT 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 igor.vaynb...@gmail.comwrote:

 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
 pieter.claas...@gmail.com 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 igor.vaynb...@gmail.com
 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 pie...@claassen.co.uk
 
  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 BaseWebModelT extends LoadableDetachableModel
 {
  
  private static final long serialVersionUID = 1L;
  
  protected Long id;
  
  public abstract ClassT getBaseClass();
  
  public abstract BaseFactoryT 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
 
 
 



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 BaseWebModelT extends LoadableDetachableModel {

private static final long serialVersionUID = 1L;

protected Long id;

public abstract ClassT getBaseClass();

public abstract BaseFactoryT 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);
}

}


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 pie...@claassen.co.uk 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 BaseWebModelT extends LoadableDetachableModel {

private static final long serialVersionUID = 1L;

protected Long id;

public abstract ClassT getBaseClass();

public abstract BaseFactoryT 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



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 pie...@claassen.co.uk 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 BaseWebModelT extends LoadableDetachableModel {

private static final long serialVersionUID = 1L;

protected Long id;

public abstract ClassT getBaseClass();

public abstract BaseFactoryT 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 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 igor.vaynb...@gmail.comwrote:

 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 pie...@claassen.co.uk
 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 BaseWebModelT extends LoadableDetachableModel {
 
 private static final long serialVersionUID = 1L;
 
 protected Long id;
 
 public abstract ClassT getBaseClass();
 
 public abstract BaseFactoryT 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
pieter.claas...@gmail.com 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 igor.vaynb...@gmail.comwrote:

 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 pie...@claassen.co.uk
 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 BaseWebModelT extends LoadableDetachableModel {
 
 private static final long serialVersionUID = 1L;
 
 protected Long id;
 
 public abstract ClassT getBaseClass();
 
 public abstract BaseFactoryT 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