我刚刚开始为Isis开发 OpenJPA对象库 。 在一般情况下,可以在persistence.xml文件中注册实体类型。 但是,Isis是一个框架,可以构建自己的元模型,并且可以自行确定哪些类构成实体。 因此,我不想强迫开发人员重复自己的工作 ,所以难题就变成了如何在Isis代码中以编程方式注册实体类型。
看起来很简单,如果有点难看。 OpenJPA允许以编程方式定义某些关键组件的实现; 这些在属性映射中指定,然后传递给javax.persistence.Persistence.createEntityManager(null,props) 。 但它也支持可用于通过setter注入初始化那些组件的语法。
在我的情况下,感兴趣的组件是openjpa.MetaDataFactory 。 有一次我以为自己会写我自己的实现。 但事实证明,标准实现满足了我的需要,因为它允许通过其setTypes(List <String>)增幅器注入类型。 字符串列表以;分隔列表的形式传递到该属性中。
所以,这就是我最终得到的结果:
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);
在我的情况下, EntityTypeList()看起来像这样:
private String entityTypeList() {final StringBuilder buf = new StringBuilder();// loop thru Isis' metamodel looking for types that have been annotated using @Entityfinal 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;
}
欢迎评论,一如既往
参考: Dan Haywood博客博客中的JCG合作伙伴 Dan Haywood以编程方式在OpenJPA中注册实体类型 。
翻译自: https://www.javacodegeeks.com/2012/06/registering-entity-types-with-openjpa.html