Mike,
Thank you for your reply. Any help is much appreciated. But I'm having
hard time translating your reply to my problem. Let me a little more
specific:
1. my Customer details form (view) allows for editing properties other than
the DistDay.
2. "e.g. adding a new day of the week to the list, then make sure you load
the
day of the week from Hibernate before adding it to the list" - but these a
simple value type enums, they might as well be integers, they are not stored
anywhere how would i go about loading them from hibernate?
3. could you elaborate on the use of merge(), especially in my case. what
do you mean "use the object returned from merge(), since all i want to do
with that object is either save or update it after the CustomerForm has set
all customer fields?
4. i don't have a DayOfWeekDao, since they are value types.
But, i do use customer = customerDao.saveCustomer(customer); , following
the appfuse's CRUD tutorials.
Sorry, i'm a noob, i know ...
Mike Horwitz wrote:
>
> On 8/23/07, p7k <[EMAIL PROTECTED]> wrote:
>>
>>
>> Please, help me learn !!!
>>
>> I have the following situation:
>>
>> a Customer class with a collection of enums which represent weekdays {
>> Sun,
>> Mon , Tue , ... }
>> ( in JSF, I bind these to a UISelectMany component - checkboxes )
>>
>> @Entity
>> public class Customer extends BaseLocation implements Serializable {
>> ...
>> private List<DaysOfWeek> distDays = new ArrayList<DaysOfWeek>();
>>
>> @CollectionOfElements( targetElement = DaysOfWeek.class )
>> @JoinTable( name = "Customer_DistDay" )
>> @Enumerated( EnumType.STRING )
>> @Column(name = "distDay", nullable = false)
>> public List<DaysOfWeek> getDistDays() { return distDays; }
>>
>> public void setDistDays(List<DaysOfWeek> distDays) { this.distDays =
>> distDays; }
>> ...
>> }
>>
>> I also have a CustomerForm action which is modeled exactly like appfuse's
>> UserForm:
>> * edit() to initialize the backBean to an existing customer if (id !=
>> null)
>> or to a new customer;
>> * save(), which calls customer = customerDao.saveCustomer(customer) -
>> saveOrUpdate() with a flush();
>> * remove() calls remove from GenericDaoHibernate.
>>
>> I have been battling a long time to get the LazyLoading working:
>> * First, I enabled
>> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter for
>> everything in my path:
>> This got me the viewing power both in CustomerList and CustomerForm.
>> Nayice!
>> I can "add" a new Customer.
>> I can't "update" (NonUniqueObjectException: a different object with the
>> same identifier value was already associated with the session ... )
>> I can't "delete"
>> (org.springframework.dao.InvalidDataAccessApiUsageException: Write
>> operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL) ...
>> )
>>
>> * Second, without much thinking/understanding, I extended my
>> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter with
>> the
>> recommended flush strategy from
>> http://wiki.apache.org/myfaces/Hibernate_And_MyFaces
>> http://wiki.apache.org/myfaces/Hibernate_And_MyFaces (it uses
>> FlushMode.COMMIT):
>> Now I got the views, "create" and "remove" working. SWELL
>>
>> BUT "update" does not work (NonUniqueObjectException: a different object
>> with the same identifier value was already associated with the session
>> ...
>> ).
>>
>> I suppose it's because the session, which contained it, no longer exists.
>> So, hibernate thinks I'm being stupid, maybe I am.
>
>
> Usually the exception is thrown because the Session has previously loaded
> an
> object with the same id and you are trying to save a new, disconnected
> instance with exactly the same id. There are several ways to tackle this
> (best approach is largely determined by what goes on in your
> view/controller):
>
> 1) If all you are doing is adding objects to a list as part of your
> update,
> e.g. adding a new day of the week to the list, then make sure you load the
> day of the week from Hibernate before adding it to the list. That should
> make sure it knows the object you are trying to save is already associated
> with the session.
> 2) Use merge() rather than saveOrUpdate() as the method used to drive the
> update in your DAO. Just be careful here - you MUST use the object
> returned
> from the merge() method once it has been called, which means returning an
> object from your save method:
>
> e.g:
>
> DayOfWeek dayOfWeek = new DayOfWeek();
> dayOfWeek = dayOfWeekDao.save(dayOfWeek);
> ... continue using dayOfWeek instance.
>
> Mike
>
> Please, help !!
>> --
>> View this message in context:
>> http://www.nabble.com/hibernate%3A-Lazy-Loading-101-tf4316007s2369.html#a12289186
>> Sent from the AppFuse - 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/hibernate%3A-Lazy-Loading-101-tf4316007s2369.html#a12291197
Sent from the AppFuse - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]