I have JPA-compliant entities (i.e. no
provider-specific annotations or library
dependencies).
I am (still, fruitlessly) trying to implement the
common use case of retrieving U. S. states as
read-only, heavily cached, etc.
After bumbling through the voluminous documentation, I
happened across the eclipselink.read-only query hint,
the @ReadOnly annotation, and the <read-only>
element. These look more promising than the other
three or four alternatives I've mentioned on this list
previously (and I'm still not sure which is the
"proper" way to indicate that my 50 states are to be
cached once and then never retrieved again from the
database).
It just so happens that all my entities that are to be
treated in this fashion inherit from a common mapped
superclass (which I've named AbstractClassifier). So
I thought hey, I'll just use the eclipse-orm.xml to
"decorate" my existing JPA entities with this
additional <read-only>true</read-only>
element.
So I put my eclipselink-orm.xml file next to my
persistence.xml file, and next to my orm.xml file in
the META-INF directory of my persistence unit.
It looked like this:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="
http://www.eclipse.org/eclipselink/xsds/persistence/orm"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.eclipse.org/eclipselink/xsds/persistence/orm
http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_1.xsd"
version="2.1">
<mapped-superclass
class="com.foobar.identity.jpa.AbstractClassifier">
<read-only>true</read-only>
</mapped-superclass>
</entity-mappings>
EclipseLink (as shipped with Glassfish 3.1) had this
to say about it:
Exception Description: Predeployment of
PersistenceUnit [LEAD] failed.
Internal Exception: java.lang.NullPointerException
Local Exception Stack:
Exception [EclipseLink-28018] (Eclipse Persistence
Services - 2.2.0.v20110202-r8913):
org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of
PersistenceUnit [LEAD] failed.
Internal Exception: java.lang.NullPointerException
at
org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:210)
at
org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1127)
at
org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:187)
at
org.glassfish.persistence.jpa.PersistenceUnitLoader.loadPU(PersistenceUnitLoader.java:205)
[etc.]
Caused by: java.lang.NullPointerException
at
org.eclipse.persistence.internal.jpa.metadata.MetadataDescriptor.getProject(MetadataDescriptor.java:1076)
at
org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.<init>(ClassAccessor.java:225)
at
org.eclipse.persistence.internal.jpa.metadata.accessors.classes.MappedSuperclassAccessor.<init>(MappedSuperclassAccessor.java:204)
at
org.eclipse.persistence.internal.jpa.metadata.ORMetadata.reloadMappedSuperclass(ORMetadata.java:550)
at
org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.addPotentialMappedSuperclass(ClassAccessor.java:498)
at
org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.discoverMappedSuperclassesAndInheritanceParents(EntityAccessor.java:258)
at
org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.preProcess(EntityAccessor.java:497)
at
org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage1(MetadataProject.java:1504)
at
org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:484)
at
org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:454)
at
org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1081)
... 36 more
I take it that doesn't work?
I will now attempt the query hint.
Any concrete real-world examples of how to cache a set
of entities from the database would be most
appreciated.
Best,
Laird