« Return to Thread: Can I use eclipselink to get the differences between two objects?

Re: Can I use eclipselink to get the differences between two objects?

by James Sutherland :: Rate this Message:

Reply to Author | View in Thread

It is using identity.  I order to make it work you would need it to resolve identity correctly for your objects.  Essentially if you create a new UnitOfWorkImpl and manufacture its' cloneMapping so that all of the objects you are comparing are the key and all of the same objects you are comparing with are the value, it may resolve correctly.

If you get it working, it may be a useful feature.  Perhaps log an enhancement for having some kind of change service in EclipseLink, and attach your code as an example.


Magnus Heino wrote:
This seems to be impossible since
ContainerPolicy.compareCollectionsForChange that will be called by
DeferredChangeDetectionPolicy to compare collections is using a
IdentityHashMap. Correct?

/Magnus

>
On Tue, Jun 10, 2008 at 9:11 PM, Magnus Heino <magnus@filur.org> wrote:

>
> If you wish to go under the covers a little their is an API,
>> DeferredChangeDetectionPolicy.createObjectChangeSetThroughComparison(),
>> that
>> will return an ObjectChangeSet listing the changes between the two
>> objects.
>>
>
> Is it possible to make it consider @OneToMany mappings also?
>
> It will report a difference no matter what I put into the @OneToMany set,
> even if the objects themself are equal if passed into the
> createObjectChangeSetThroughComparison method.
>
> I would like to work with a object graph rather than with individual
> objects.
>
> Under the covers api's are not a problem.
>
> I currently do it like this:
>
>     @Autowired
>     private JpaEntityManager entityManager;
>
>     private final ObjectChangePolicy objectChangePolicy = new
> DeferredChangeDetectionPolicy();
>
>     public ObjectChangeSet compare(final AbstractEntity original, final
> AbstractEntity copy) {
>         ObjectChangeSet objectChangeSet =
> this.objectChangePolicy.createObjectChangeSetThroughComparison(original,
> copy,
>             (UnitOfWorkChangeSet)
> this.entityManager.getUnitOfWork().getCurrentChanges(), false,
> (AbstractSession) this.entityManager
>                 .getActiveSession(),
> this.entityManager.getActiveSession().getDescriptor(original.getClass()));
>
>         return objectChangeSet;
>     }
>
> Thanks!
>
> /Magnus
>
>>
>
>>
>>
>> Magnus Heino wrote:
>> >
>> > Hi.
>> >
>> > Lets say I have
>> >
>> > Foo foo = new Foo(2);
>> > Foo foo2 = new Foo(3);
>> >
>> > Foo is an @Entity mapped by eclipselink.
>> >
>> > Can I somehow use components of eclipselink to compare foo and foo2, and
>> > get
>> > a list of differences?
>> >
>> > --
>> >
>> > /Magnus Heino
>> >

 « Return to Thread: Can I use eclipselink to get the differences between two objects?