openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Craig L Russell <Craig.Russ...@Sun.COM>
Subject Re: Curious about subclassing rather than entity enhancement
Date Mon, 27 Jul 2009 19:36:20 GMT
Hi Mike,

On Jul 27, 2009, at 12:07 PM, Yawn, Mike wrote:

> Hi Craig,
> Thanks for the details ... see below
>> -----Original Message-----
>> From: Craig.Russell@Sun.COM [mailto:Craig.Russell@Sun.COM]
>> Sent: Monday, July 27, 2009 10:06 AM
>> To:
>> Subject: Re: Curious about subclassing rather than entity enhancement
>> Hi Mike,
>> On Jul 27, 2009, at 8:45 AM, Yawn, Mike wrote:
>>> I'm curious about something I read on the 'Entity Enhancement' page.
>>> Currently, our "JPA-like" implementation of annotations uses the
>>> standard JPA annotations, but on an interface rather than a class.
>> This is a very common (good) pattern for persistence.
> [Yawn, Mike] But one that seems to be expressly prohibited by JPA spec
> (Section 2.1, "The entity class must be a top-level class. An enum or
> interface must not be designated as an entity.".   Does OpenJPA allow
> this?

Yes. See 5.3 of the OpenJPA manual "Managed Interfaces".

> (If not currently, and we made modifications to work with
> interfaces, would OpenJPA be interested in this code or should we plan
> to keep it in our own branch?)
>>> Then, our code generation generates the implementation classes from
>>> the
>>> interface; we don't ever add or modify code behind the user's back,
> so
>>> all the implementation code is fully visible.
>> So you need a factory to allow the user to create a new instance of
>> the implementation class. How do you tell the user what to "new", or
>> perhaps you have a factory with a method like <T> T
>> newInstance(Class<T> interface)?
> [Yawn, Mike] We have a DAO class that provides basic lifecycle
> functionality (insert, update, delete, findByPK, plus user-added
> queries).  The DAO also provides a createLocal() method that returns a
> non-persistent (local) data object that can later be passed to the
> 'insert' method.   The return type of createLocal is the entity
> interface, and what we return is the implementation class with all of
> the state tracking, etc.  So our EntityManager methods would mostly be
> calling the DAO.
>>> On the entity enhancement page, there is a statement that "Some JPA
>>> providers auto-generate new subclasses or proxy objects that front  
>>> the
>>> user's Entity objects at runtime" ...., and I'm curious how this  
>>> works
>>> given that it seems that the mechanism for creating an entity object
>>> is to call "new" on it.
>> This is how users create an entity to persist. But once it's
>> persisted, the provider has its own factory that it uses when  
>> fetching
>> instances from the database.
> [Yawn, Mike] persist doesn't return an object to the caller -- once an
> object is initially persisted, can the user continue to work with that
> object (modify fields), or do they need to retrieve the object from  
> the
> EntityManager first?  Because in the first case I don't see how the
> implementation can be detecting any state changes to the object.

There are some corner cases if you persist an entity, flush it to the  
database, and then continue to modify it. But if you persist and  
commit, these issues go away. After commit, the instance is detached  
and you need to reacquire the persistent instance from the entity  

>>> So, if there is a JPA-annotated class that
>>> represents the entity, and then a JPA implementer creates a subclass
>>> of
>>> this to provide loaded / dirty tracking, etc., it seems that any
>>> instantiation of the Entity via "new"  would be getting the  
>>> annotated
>>> base class, not the subclass with the implementation of these
>>> features.
>> Right.
>>> How is that being handled in JPA implementations that use subclasses
>>> rather than byte-code weaving ?
>> Byte-code enhancement is done primarily to allow detection of  
>> changes,
>> which by definition isn't needed for new instances (all fields are
>> considered changed for newly persisted instances).
>> Craig
>>> Thanks,
>>> Mike Yawn
>>> eBay Inc.
>> Craig L Russell
>> Architect, Sun Java Enterprise System
>> 408 276-5638
>> P.S. A good JDO? O, Gasp!
> [Yawn, Mike] Hmm, that P.S. looks anagram-y but I can't decipher it.
> Mike

Craig L Russell
Architect, Sun Java Enterprise System
408 276-5638
P.S. A good JDO? O, Gasp!

View raw message