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



Reply via email to