[offline conversation returned to thread]
Igor,
I understand about using the AccountBean. That is not where the problem
lies.
Problem: how to update encapsulated field(s) of the Account object from the
AccountBean??? See details below. Account does NOT have set methods for
these fields, so I cannot simply copy properties from the bean to the
newly-created object. That is the difficulty.
Thanks,
RDC
i dont see why you have to give up encapsulation of anything...
the bean you create does not extend account, in fact it extends
nothing, just implements serializable. you only need this bean when
you are creating a new instance of account.
then in onsubmit() you do
onsubmit() {
AccountBean bean=getModelObject();
Account acc=new Account(bean.getEmail());
// copy other properties from bean to acc
dao.save(acc);
// ^ at this point you should have the id set by hibernate
setModel(new HibernateEntityModel(acc));
// ^ notice we set a new model, from now on this form will operate
on the instance of Account object
}
-igor
On Jan 24, 2008 6:42 PM, RDC <[EMAIL PROTECTED]> wrote:
> Igor,
>
> Thanks again for your time.
>
> Here's the difficulty I am having with implementing the bean idea.
>
> Account is a subclass of another class, let's call it Persistable.
> Persistable has a
private rowId field which represents the id of the object in a relational
db. That class
implements a public getRowId() method, but NOT a setRowId method. This is
the design
recommended by Hiberate, which I am using as my ORM. Hibernates sets the
rowId field
directly reflexively, using a value provided by the db.
>
> Let's say the Form has an AccountBean as its model object. That bean gets
> updated by
the FormComponents without problem. It also gets saved to the db, and
Hibernate sets its
rowId field. So far, so good.
>
> The problem: how to set the rowId of the newly-created Account object from
> the
AccountBean, while at the same time keeping respecting the encapsulation of
rowId????
Only two choices I see are:
>
> 1. create a protected setRowID() method in Persistable (Persistable and
> Account are
in different packages); or
> 2. set the rowId field reflexively.
>
> As in all good software engineering, both have pluses and minuses and
> involve
tradeoffs. I am really hesitant to give up the safety of the strong
encapsulation of the
rowId field. Plus, there are other fields with similar limitation. This
prompted me to
try to find a different solution.
>
> Would love your thoughts on this. Like everyone, my knowledge of java is
> incomplete.
Do you see any other options?
>
> RDC
> > Although I believe your solution is the best because of its simplicity,
> due to
other (non-wicket) constraints in my design (encapsulation of fields of an
Account
superclass), I was unable to use a bean or subclass the form.
>
> not really sure why this is an issue for you. give
> class Account { private String email,name; public Account(String
> email) { ... } ... }
>
> you can always do
>
> class AccountBean { private String email,name;}
>
> set instance of AccountBean as the model object of the form and then
> in onsubmit() { AccountBean bean=getModelObject(); Account account=new
> Account(bean.getEmail()); account.setName(bean.getName());
> form.setModelObject(account); }
>
> you dont break any encapsulation...
>
>
> cheers,
> -igor
and it is also more elegant to e.g. create a copy constructor or
utility object for copying so that you don't have your submit method
littered with code to copy properties. That's largely a matter of
taste though.
--
View this message in context:
http://www.nabble.com/create-new-model-object-of-a-Form-from-one-of-its-FormComp-values---tp14983110p15098864.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]