我也在这个问题上苦苦挣扎。我认为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;
}