在Spring的帮助下,我以符合JPA的方式进行了此操作。
我的“persistence.xml”看起来是空的,没有在< persistence-unit>元件。
然后我写了一个实现PersistenceUnitPostProcessor的类,如下所示:
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.MappedSuperclass;
import org.reflections.Reflections;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;
public class ReflectionsPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor {
private String reflectionsRoot;
private Logger log = LoggerFactory.getLogger(ReflectionsPersistenceUnitPostProcessor.class);
@Override
public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
Reflections r = new Reflections(this.reflectionsRoot, new TypeAnnotationsScanner());
Set entityClasses = r.getStore().getTypesAnnotatedWith(Entity.class.getName());
Set mappedSuperClasses = r.getStore().getTypesAnnotatedWith(MappedSuperclass.class.getName());
for (String clzz : mappedSuperClasses)
{
pui.addManagedClassName(clzz);
}
for (String clzz : entityClasses)
{
pui.addManagedClassName(clzz);
}
}
public String getReflectionsRoot() {
return reflectionsRoot;
}
public void setReflectionsRoot(String reflectionsRoot) {
this.reflectionsRoot = reflectionsRoot;
}
}
然后我调整了我的spring context xml,如下所示:
注意在persistenceUnitPostProcessors设置中注册ReflectionsPersistenceUnitPostProcessor。
就是这样在类路径中具有JPA实体或MappedSuperclass注释的每个类都添加到类路径中。我不得不反思一个包名称的前缀来扫描,这是为什么com.austinmichael在那里。如果您的实体不共享通用包名称前缀,则可以使用不同的包名前缀注册第二个ReflectionsPersistenceUnitPostProcessor。
但是,这是现在JPAVendor不可知论。