Transparent Object Persistence

hakan eryargi <[email protected]> Sun, 24 Nov 2013 20:10:01 +0200
Newsgroups gmane.comp.java.prevayler
Message-ID <CAPg-4YXa_V4Q9F_HmQQLXWkH5UNVaHxDbVhH-RfnOZPrZgnMhQ@mail.gmail.com>
Justin, thanks for the pointer:) The Facade idea is definetely not bad, but
I think regarding the possibilities it's a bit unsufficient. The problem
IMHO is, Prevayler itself honors object oriented design but the Facade idea
-in contrast- utilizes service oriented design and introduces an uncessary
layer for persistence.

Wouldnt it be great if objects are transparently persisted?

Root root = Persister.create(Root.class)

class Root implements Serializable {
   @Writer
   void setSomeProperty(X x) {}

   @Writer
   void setSomeOtherProperty(Y y) {}

   @Reader
   X getSomeProperty() {}
}


For top level class (the root of object graph) I suppose that's a piece of
cake to implement with aspects or bytecode enhancement.

For child classes, there is a difficulty of accesing target object while
executing the transaction. But I believe this can be solved to some degree
by replacing collections with wrapper collections.

For example a typical pattern is:

class Root {
   Map<Integer, Child> children;

   @Writer
   void saveChild(Child c) {
       children.put(c.id, c);
   }

   @Reader
   Child getChild(int id) {
      return children.get(id);
   }
}

class Child {
   @Key
   int id;

   @Writer
   void setSomeProperty(X x) {}
}

Now, If we replace children map with a special wrapper map, at the point of
insertion, we can store the access path to the child in a special bytecode
enhanced field of Child. Something like: parentClass: Root, id=idValue. So
the transaction will be like (or the reflective equivalent) :

root.children.get(id).setSomeProperty(x);

If the Child has no filled in path field than it means it's not attached to
Root and write action should not be encapsulated in a transaction. If it's
later inserted into object graph, then it will be written as it's (its
properties are set etc) in a transaction.

For deeper classes in hierarchy it's more complicated but I guess same
principle can be applied. Just store the parent's key value in
path-to-object field, and when write method is executing, traverse up in
the hierarchy and check if Root is accesible. If so, object can be accessed
in the same way:

root.children.get(id).someOtherChilren.get(otherId)...setSomeProperty(x);

Some annotations may also help this process.

@Path("Root/chilren/{id}/someOtherChildren/{otherId}")
class SomeChild {
}

Of course this is much more complicated then I wrote here and several
unforseen problems may occur (for example arrays can not be handled this
way) but I belive it may worth the effort.

Combine this with Spring's dependency injection:

<prevayler:component-scan base-package="some.package" />

package some.package;
@Root // a persisted object graph root
class Root {
}

Root can be injected:

class SomeBean {
   @Autowired
   Root root;
}

And maybe even child classes can be injected:

class SomeOtherBean {
   @Autowired
   @PathToChild("/Root/42") // 42 is id of child
   Child child;
}

And other beans can be injected into persisted objects too

class Root  {
    @Autowired
    transient EmailService emailService;
}

Wouldn't that be revolutionary? What do you think?

*r a f t*


On Fri, Nov 22, 2013 at 8:40 AM, Justin T. Sampson <[email protected]>wrote:

> Yes, Prevayler uses synchronized(prevalentSystem){...} internally for both
> queries and transactions (plus additional synchronization for transactions
> to get the journal sequencing right).
>
> A few people have played with the latter idea. There's even a
> proof-of-concept included with Prevayler, in the extras/facade module.
>
>
>
> On Thu, Nov 21, 2013 at 11:20 AM, hakan eryargi <[email protected]>wrote:
>
>> is it enough to sync on root object for reads? writing a query class for
>> each read is really verbose.
>>
>> indeed even writing tx classes for writes is also verbose. a future
>> improvement may be using magic @annotations very much like spring's.
>>
>> r a f t
>>
>>
>> ------------------------------------------------------------------------------
>> Shape the Mobile Experience: Free Subscription
>> Software experts and developers: Be at the forefront of tech innovation.
>> Intel(R) Software Adrenaline delivers strategic insight and game-changing
>> conversations that shape the rapidly evolving mobile landscape. Sign up
>> now.
>>
>> http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk
>> _______________________________________________
>> To unsubscribe go to the end of this page:
>> http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
>> _______________________________________________
>> "Databases in Memoriam" -- http://www.prevayler.org
>>
>>
>
>
> ------------------------------------------------------------------------------
> Shape the Mobile Experience: Free Subscription
> Software experts and developers: Be at the forefront of tech innovation.
> Intel(R) Software Adrenaline delivers strategic insight and game-changing
> conversations that shape the rapidly evolving mobile landscape. Sign up
> now.
> http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk
> _______________________________________________
> To unsubscribe go to the end of this page:
> http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
> _______________________________________________
> "Databases in Memoriam" -- http://www.prevayler.org
>
>

------------------------------------------------------------------------------
Shape the Mobile Experience: Free Subscription
Software experts and developers: Be at the forefront of tech innovation.
Intel(R) Software Adrenaline delivers strategic insight and game-changing 
conversations that shape the rapidly evolving mobile landscape. Sign up now. 
http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk

_______________________________________________
To unsubscribe go to the end of this page: http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
_______________________________________________
"Databases in Memoriam" -- http://www.prevayler.org