我也在这个问题上苦苦挣扎。我认为PersistenceUnitInfo必须由容器(即应用程序服务器)提供。这意味着 Eclipselink 不会自己创建一个。如果您使用的是 Spring ORM,它会使用 aDefaultPersistenceUnitManager并调用其obtainPersistenceUnitInfo(String unitName)方法来获取PersistenceUnitInfo. unitName 必须在persistence.xml. 这意味着您仍然需要一个 xml 文件。
通过深入研究 Spring ORM 的源代码,我发现 Spring 提供了几种PersistenceUnitInfo. 事实上,它们通常是一个 Java Bean。您可能对SmartPersistenceInfo和MutablePersistenceInfo感兴趣SpringPersistenceUnitInfo。在Github上查看它们。
编辑:
我找到了 Eclipselink 的实现:它SEPersistenceUnitInfo在org.eclipse.persistence.internal.jpa.deployment. 还找到了读取配置xml文件中每个持久性单元的方法。
public static Set<SEPersistenceUnitInfo> getPersistenceUnits(ClassLoader loader, Map m, List<URL> jarFileUrls) {
String descriptorPath = (String) m.get(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML);
if(descriptorPath == null) {
descriptorPath = System.getProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML_DEFAULT);
}
Set<Archive> archives = findPersistenceArchives(loader, descriptorPath, jarFileUrls);
Set<SEPersistenceUnitInfo> puInfos = new HashSet();
try {
for(Archive archive : archives) {
List<SEPersistenceUnitInfo> puInfosFromArchive = getPersistenceUnits(archive, loader);
puInfos.addAll(puInfosFromArchive);
}
} finally {
for(Archive archive : archives) {
archive.close();
}
}
return puInfos;
}