我剛剛開始為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