可以使用
创建没有持久性单元xml的EntityManagerFactoryorg.eclipse.persistence.jpa.PersistenceProvider {
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info,
java.util.Map properties)
}
但是eclipselink中的javax.persistence.spi.PersistenceUnitInfo的实现类是什么
答案 0 :(得分:4)
我也在努力解决这个问题。我认为容器(即Application Server)必须提供PersistenceUnitInfo
。这意味着Eclipselink本身不会创建一个。如果您使用的是Spring ORM,则会使用DefaultPersistenceUnitManager
并调用其obtainPersistenceUnitInfo(String unitName)
方法来获取PersistenceUnitInfo
的实例。必须在persistence.xml
中定义unitName。这意味着您仍然需要一个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;
}
答案 1 :(得分:1)
Java EE平台规范6说:容器负责查找persistence.xml,将信息压缩到PersistenceUnitInfo中,并通过调用createContainerEntityManagerFactory来提供它。
答案 2 :(得分:0)
PersistenceUnitInfo由Spec定义,请参阅JPA规范代码或JavaDoc以实现它。
http://www.eclipse.org/eclipselink/api/2.5/javax/persistence/spi/PersistenceUnitInfo.html