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