That may be workable but I have to recoil a little when we talk about
bringing Spring into the mix. It has its purpose but I would hate to make it
an implicit requirement of using Record with JPA; it's just huge.

Derek

On Mon, Dec 15, 2008 at 12:46 PM, Daniel Mueller
<dan.in.a.bot...@gmail.com>wrote:

>
> I never did it with JPA, that's why I mentioned that there might be
> some problems to circumnavigate (my websearch turned up that it's not
> possible, but I might have missed something). But on the actual
> backend frameworks you can do things like that (or at least hibernate
> can [1,2, also see 3 below]).
>
> The best resource to describe what we want to do is Spring ORM [3].
> They had the same problem and describe the caveats with it (see the
> text box for loadtime weaving under the JPA section). If we would run
> our generation through Spring ORM we should probably get away with a
> Record-only setup, where Record boots Spring ORM with dynamic classes
> (Maps) and configures the desired backend. The nice thing would be
> that Spring is already aware of which backend you use and optimizes
> accordingly.
>
> I don't really like the fact that this adds a truckload of
> dependencies to the stack (spring-{orm,beans,context,core,tx} are
> required, couple more optional), but it's the easiest solution I can
> think of in terms of integration and timerequirements, and it should
> also be pretty stable and straightforward to use for the users (Spring
> has nice documentation IMO). Oh, and just if you were wondering, this
> is the supported frameworks list: Hibernate, JDO, Oracle TopLink,
> iBATIS SQL Maps and JPA. The biggies are supported without even going
> through JPA. Sweet.
>
> Daniel
>
> [1] http://forums.oracle.com/forums/message.jspa?messageID=2432779
> [2] http://wiki.eclipse.org/Eclipselink/Examples/JPA/Dynamic
> [3] http://static.springframework.org/spring/docs/2.5.x/reference/orm.html
>
> On Dec 15, 9:41 pm, "Derek Chen-Becker" <dchenbec...@gmail.com> wrote:
> > I've been thinking a little about the XML path and there may be a
> wrinkle.
> > No matter how you define the XML mappings, JPA expects persistable fields
> to
> > either be real fields (var) on the instance or getter/setter pairs; using
> an
> > object for field a la Record still isn't either of these. I have a busy
> few
> > weeks ahead but I'm going to do some reading in the meantime and see if
> we
> > can come up with something transparent but easy to use.
> >
> > Derek
> >
> > On Mon, Dec 15, 2008 at 12:39 AM, Daniel Mueller
> > <dan.in.a.bot...@gmail.com>wrote:
> >
> >
> >
> > > (Reactivating discussion. I guess it's been discussed more on the
> > > committer list, but here you have my 2 cents anyway)
> >
> > > For the sake of the Record-JPA discussion, people will fall into two
> > > categories when they are using lift:
> > > * The first group of people have an existing, working, tested JPA/OR
> > > based data access library written in Java and are looking to integrate
> > > that with a webapp written in lift. They will usually be coming from
> > > an enterprise background, and will have some constraints on what they
> > > can develop from scratch ("no - we will not rewrite all the db access
> > > code to support the new web framework").
> > > * The second group doesn't have an existing data access library in
> > > Java and would like to write all their new stuff with lift in Scala.
> > > But maybe they have mapping/usage requirements that precludes using
> > > mapper because it's too simple, or they just know their way around one
> > > of the other JPA enabled OR libs and want to bank on that knowledge
> > > (without writing the entire layer in Java).
> > > * The third group also doesn't have an existing data access library,
> > > but for some reasons, they want their OR model not only be accessible
> > > from lift, but actually also from Java code. This means that they not
> > > only have to be able use JPA, but that the Scala code they write has
> > > to be _JPA compatible_ (Java usable JPA entities etc.).
> >
> > > For the first group, some sort of delegation strategy from the Record
> > > entity to the JPA entity is necessary (unless you can mixin the record
> > > stuff on top of an actual JPA entity?). The JPA/OR configuration is
> > > already in place on the existing lib (annotations/xml). The only thing
> > > that record is doing is adding another layer on top of it for
> > > validation, binding to UI, maybe querying. Something like what was
> > > proposed earlier by Derek should be enough
> >
> > > > class MyEntry extends Record[MyEntry] {
> > > >   var inner : RealEntry = _
> >
> > > >   object name extends StringField(this) with Delegation
> > > >   name.delegate(inner.name, inner.name = _)
> >
> > > >   ...
> > > > }
> >
> > > Now for the second group, they probably would like to have all the
> > > power associated with a JPA/OR framework without resolving to writing
> > > that layer in Java. Mind you that this is quite a different problem
> > > from what the first group wants to solve.
> > > * They just want to have Record entities, no separate JPA entity, no
> > > delegation.
> > > * They don't want to duplicate configuration from what they already
> > > specify on Record entities.
> > > * Have the integration as hassle free as possible, because in their
> > > eyes, there is no actual delegation.
> >
> > > What the second group needs is a bit trickier, and most of the
> > > discussion has revolved around how to make it as transparent as
> > > possible (compiler plugins, byte code weaving, etc.).
> >
> > > Remember that for the second group of people Record is attempting to
> > > solve the _exact same problem_ as JPA. It's a unifying frontend, that
> > > abstracts away differences in persistence libraries. And as with JPA,
> > > Record has the configuration present in code (instead of annotations
> > > it just uses actual subclasses and parameters, but still).
> >
> > > But there's one thing that has only been mentioned on the off by
> > > David.
> >
> > > > I believe there are ways to use Record's deep knowledge of class
> layouts
> > > to
> > > > generate data structures and/or XML to send to JPA to "do the right
> > > thing."
> >
> > > The key point here is XML. While those annotations are a nice feature
> > > for the programmer to get rid of the XML configuration from pre EJB
> > > 3.0, it's less than sexy for attaching a unified API (record) to an
> > > implementation library (jpa, which incidentially is another unified
> > > API for the actual OR libs :/ ). But that's a feature for the
> > > developer who doesn't want to specify the configuration in an XML. But
> > > the XML configuration capability is still there. Generating XML from
> > > Record entities (maybe even in memory) to boot the JPA/OR lib should
> > > be pretty easy and doesn't require more opaque techniques (compiler
> > > plugin, byte code weaving).  And it can be overridden easily as well
> > > even to integrate things that are not supported in Record.
> > > I'm not well versed enough in JPA to make statements about whether the
> > > XML configuration is feature complete compared to the annotations, and
> > > how flexible the mapping can be (directly from the Record object
> > > fields to the columns). I would assume that the mapping is not
> > > flexible enough to work with the objects fields from Record, but maybe
> > > we can start discussing strategies to solve that (using vars,
> > > generating bytecode, using untyped maps as entities, generating OR lib
> > > specific XML - And yes I know that with a couple of those you loose
> > > some features provided by JPA).
> >
> > > For the third group of people, those that want to use reuse their
> > > objects as Java compatible JPA entities: Do we really need that right
> > > now? Are there enough real use cases to warrant the effort? Mind that
> > > you can always write a Java compatible access layer for your entities
> > > in Scala. In that layer you refrain from using stuff that Java doesn't
> > > like and then just use that connector from your java code. IMO lift
> > > shouldn't solve that problem. Although it's interesting, I don't
> > > really see the benefit of having actual JPA object usable from Java.
> > > As already discussed on the list, there's a whole bunch of
> > > compatibility problems to make the Record entity be an actual JPA
> > > entity. If we find out that solving the problem for the second group
> > > is only possible if we solve this one, then fine, otherwise I
> > > personally wouldn't bother to fix that thing now. You can code around
> > > it and it shouldn't be that much of a problem to do so.
> >
> > > Pick your battles...
> >
> > > Daniel
> >
> > > On Dec 2, 1:22 am, "David Pollak" <feeder.of.the.be...@gmail.com>
> > > wrote:
> > > > My 2 cents:
> >
> > > >    - I'm strongly opposed to any compiler plugins as they (1) mean
> that
> > > IDEs
> > > >    will work less well and (2) they require some sort of installation
> (if
> > > they
> > > >    can be rolled into the Maven building stuff, it makes this
> objection
> > > go
> > > >    away)
> > > >    - I'm strongly opposed to mixing annotations and the Record stuff.
> > >  It'll
> > > >    just make for wicked ugly looking code.
> >
> > > > I believe there are ways to use Record's deep knowledge of class
> layouts
> > > to
> > > > generate data structures and/or XML to send to JPA to "do the right
> > > thing."
> >
> > > > On Sun, Nov 30, 2008 at 7:45 AM, Derek Chen-Becker <
> > > dchenbec...@gmail.com>wrote:
> >
> > > > > The whole point of integrating (and I use the word integrating here
> > > > > loosely) is so that there's a common form framework for people to
> use.
> > > > > Really, the point of Record as far as I can tell is to loosen
> and/or
> > > remove
> > > > > the tight coupling with the datastore, and in that sense Record is
> > > > > succeeding. As Tim points out, there are going to be people with
> > > existing
> > > > > JPA libraries and what we're trying to propose is a means for them
> to
> > > > > leverage their existing libraries alongside the nice work done in
> > > Record. As
> > > > > ugly as the boilerplate for delegation may seem, I don't see any
> better
> > > > > solution without adding significant complexity. I've done bytecode
> > > > > manipulation in the past and while it can be very handy, it makes
> > > things a
> > > > > lot more complex on the backend and I'm really trying to avoid
> > > complexity
> > > > > (this includes a compiler plugin, too).
> >
> > > > > Delegation provides the cleanest approach I can come up with; it
> > > actually
> > > > > helps in the case where someone wants to use an existing JPA
> library
> > > because
> > > > > you could simply wrap an instance and delegate to it:
> >
> > > > > class MyEntry extends Record[MyEntry] {
> > > > >   var inner : RealEntry = _
> >
> > > > >   object name extends StringField(this) with Delegation
> > > > >   name.delegate(inner.name, inner.name = _)
> >
> > > > >   ...
> > > > > }
> >
> > > > > By adding a few lines of boilerplate in each class you get
> validation,
> > > form
> > > > > generation, presentation HTML, JSON representation, etc. It's up to
> the
> > > > > end-user to determine whether these features are worth the cost of
> a
> > > few
> > > > > LoC.
> >
> > > > > I'm not saying this is a perfect solution, just that I think that
> this
> > > is
> > > > > the best first cut at it. Also, no one is saying that people have
> to
> > > use JPA
> > > > > with Record. I'm assuming that the majority of new Lift apps will
> > > probably
> > > > > use Record/Mapper because they're simple, easy to use and quite
> capable
> > > of
> > > > > handling most data models. But for the people with existing JPA
> > > libraries,
> > > > > or for people who would like to use JPA for the additional
> features,
> > > > > compatibility with Java apps, etc, I'd like to have a better answer
> > > than an
> > > > > absolute "Don't use Record" or "Switch to Record".
> >
> > > > > Derek
> >
> > > > > On Sun, Nov 30, 2008 at 1:40 AM, Marius <marius.dan...@gmail.com>
> > > wrote:
> >
> > > > >> I totally agree with you Viktor! ... although it seems like a
> workable
> > > > >> solution in this case a Record contains to distinct entities to
> > > > >> represent the same data and of course the boilerplate.
> >
> > > > >> It was mentioned above compiler plugins which I expressed my
> opinion
> > > > >> about it (I'd stay away) but there might be another way to "alter"
> the
> >
> > ...
> >
> > read more ยป
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to