On Aug 1, 2007, at 8:17 PM, Marc Prud'hommeaux wrote:
I think the problem is that a class registers itself exactly once
with the PCRegistry. So if we unregister it with EMF.close(), then
if we were to subsequently create a new EMF, the class would no
longer be registered.
If we are interested in discussing alternate approaches, though,
the following just occurred to me: if the only problem preventing
us from having PCRegistry classes as weak keys is that their value
graph eventually hits on the template instance of the entity, we
could just remove the template instance from the PCRegistry graph,
and instead keep around a separate Map<Class:Object> of the class
to the template instance in the EntityManagerFactory/BrokerFactory
itself (which could be lazily initialized whenever the template
instances are needed). That way, when the EMF is destroyed, there
would be no template instances around to prevent the weak
PCRegistry class keys from getting cleaned up.
The only hitch is that the registration of the template instance
occurs in the enhancement bytecode of the entity itself, which
allows us to deal with private/protected no-arg constructors (which
we synthetically add if none exists) without having to muck around
with security. We'd need to consider whether we are willing to
sacrifice that.
IIUC, the template instance is (or is contained by) the
PersistenceCapable object? Sounds right since you say it's part of
the enhancement bytecode...
Sounds like this would work -- as long as the Object in
Map<Class:Object> (I assume this a WEAK keyed Map) does not reference
an Object or Class that is loaded in an application ClassLoader. So,
JRE classes, OpenJPA classes, OpenJPA dependent libraries (e.g.
commons library, etc) would all be good. It just can't reach an
application (or enhanced application) class...
--kevan