It turns out to be pretty simple, if a little ugly. OpenJPA allows implementations of certain key components to be defined programmatically; these are specified in a properties map that is then passed through to . But it also supports a syntax that can be used to initialize those components through setter injection.
In my case the component of interest is the . At one point I thought I’d be writing my own implementation; but it turns out that the standard implementation does what I need, because it allows the types to be injected through its mutator. The list of strings is passed into that property as a ;-delimited list.
So, here’s what I’ve ended up with:
final Map<String, String> props = Maps.newHashMap();
final String typeList = entityTypeList();
props.put("openjpa.MetaDataFactory",
"org.apache.openjpa.persistence.jdbc.PersistenceMappingFactory(types=" + typeList + ")");
// ... then add in regular properties such as
// openjpa.ConnectionURL, openjpa.ConnectionDriverName etc...
entityManagerFactory = Persistence.createEntityManagerFactory(null, props);
where in my case looks something like:
private String entityTypeList() {
final StringBuilder buf = new StringBuilder();
// loop thru Isis' metamodel looking for types that have been annotated using @Entity
final Collection<ObjectSpecification> allSpecifications =
getSpecificationLoader().allSpecifications();
for(ObjectSpecification objSpec: allSpecifications) {
if(objSpec.containsFacet(JpaEntityFacet.class)) {
final String fqcn = objSpec.getFullIdentifier();
buf.append(fqcn).append(";");
}
}
final String typeList = buf.toString();
return typeList;
}
Comments welcome, as ever
Reference: Registering entity types with OpenJPA programmatically from our JCG partner Dan Haywood at the Dan Haywood blog blog.
Thank you!
We will contact you soon.

This site uses Akismet to reduce spam. Learn how your comment data is processed.