I do the same exact trick, but I convert a PersistentBag to an
ArrayList.

The tricky part is figuring out where to put your "copy" code so that
it doesn't get in the way or complicate your existing code.  I use a
custom field serializer, which is an undocumented feature of GWT.

If you have an object, say Foo, you can customize the GWT RPC
serialization for Foo by creating a class in the same package as Foo,
called Foo_CustomFieldSerializer.  Then you add two static methods to
the class as follows:

public static void serialize(SerializationStreamWriter writer, Foo
instance) throws SerializationException {

}

public static void deserialize(SerializationStreamReader reader, Foo
instance) throws SerializationException {

}

Then for every field, you call the appropriate methods in the writer
or reader to serialize or deserialize.  Here's the cool part.  When
you encounter a collection managed by Hibernate, you can simply swap
out the collection for a GWT safe implementation.  So if Foo has a one
to many collection called bars (say it's a List), you can safely
serialize it with the following code:

public static void serialize(SerializationStreamWriter writer, Foo
instance) throws SerializationException {
  ...
  writer.writeObject(new ArrayList(instance.getBars()));
  ...
}

and the deserialization is just as easy

public static void deserialize(SerializationStreamReader reader, Foo
instance) throws SerializationException {
  ...
  instance.setBars((List)reader.readObject());
  ...
}

The best part about using a custom field serializer is that your
original object does not get modified.  I tried an approach where I
swapped out the collection just prior to returning from my RPC
method.  This caused two problems.  First it complicated the code.
Second, Hibernate detected a change to my object and persisted it.
This wasn't a huge problem, but it did cause an unnecessary write to
the database.

I also looked into Hibernate4GWT.  But I found that if you don't need
to do lazy loading of persistent collections on the client side, then
Hibernate4GWT is overkill.

-Greg


On Dec 8, 2:55 pm, "Arthur Kalmenson" <[EMAIL PROTECTED]> wrote:
> It's also possible to force it to use a HashSet by copying the
> contents of the PersistentSet to a new HashSet. That worked for us.
>
> --
> Arthur Kalmenson
>
>
>
> On Sun, Dec 7, 2008 at 7:05 AM, gregor <[EMAIL PROTECTED]> wrote:
>
> > Hi,
>
> > PersistentSet is one of Hibernate's "magic collections". Like the
> > proxies that Hibernate also uses for lazy loading, domain objects so
> > adorned are incompatible with the GWT Emulation library and AFAIK
> > there is no direct way around it at the moment. You have to copy them
> > to DTO representations for transfer and copy them back on return.
>
> > Hibernate4gwt does this for you - have you had a look at it?
>
> > regards
> > gregor
>
> > On Dec 7, 9:54 am, LoneWolf <[EMAIL PROTECTED]> wrote:
> >> Hey,
> >> Our application is using Hibernate 3 as the persistence mechanism, and
> >> of course we have one-to-many relationship.
> >> The problem is when trying to pass a domain object that has a list of
> >> lazy initialized objects back to the browser, I got this exception:
> >> ++++
> >> Caused by: com.google.gwt.user.client.rpc.SerializationException: Type
> >> 'org.hibernate.collection.PersistentSet' was not included in the set
> >> of types which can be serialized by this SerializationPolicy or its
> >> Class object could not be loaded. For security purposes, this type
> >> will not be serialized.
> >> ++++
> >> Yes, I understand this exception but to overcome this issue?
> >> Thanks.- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to Google-Web-Toolkit@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to