Re: Transparent Object Persistence
hakan eryargi <[email protected]> Sun, 24 Nov 2013 23:32:53 +0200
| Newsgroups | gmane.comp.java.prevayler |
|---|---|
| Message-ID | <CAPg-4YVZNPPqUBvhpBnunhcOLHspwevSn=PD7+eUEorwvQXSTw@mail.gmail.com> |
come on, AFAIK object databases does not store POJO's. I'm talking about persisting POJO's transparently here. for tx boundaries, it's determined by methods with @Writer (@Transaction is better I suppose) annotations which are in classes that can be accessed starting from Root. On Nov 24, 2013 10:31 PM, "Justin T. Sampson" <[email protected]> wrote: > That's not revolutionary, that's an object-oriented database. :) Not a bad > idea, but a different idea than Prevayler. > > The essential issue is how to demarcate transaction boundaries. It's not > sufficient for individual setter calls to be their own transactions, so > you've gotta have some higher-level coordination. > > Prevayler itself does this using a variant of the Command Object design > pattern, where each command object encapsulates a single transaction. The > Facade design pattern is the most obvious alternative, where every method > declared on the facade demarcates a transaction. > > Both of those options are legitimate object-oriented design patterns. :) > > Domain-Driven Design offers another way to think of transactional > boundaries: The Aggregate design pattern is intended precisely to demarcate > transactional boundaries in a domain model. So that might be a fruitful > area of study if you're concerned about the design side of things. > On Nov 24, 2013 10:10 AM, "hakan eryargi" <[email protected]> wrote: > >> 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 >> >> > > ------------------------------------------------------------------------------ > 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