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