Программно загрузка классов сущности с JPA 2.0?
Вопрос
С Hibernate вы можете загрузить свой Entity
классы как:
sessionFactory = new AnnotationConfiguration()
.addPackage("test.animals")
.addAnnotatedClass(Flight.class)
.addAnnotatedClass(Sky.class)
.addAnnotatedClass(Person.class)
.addAnnotatedClass(Dog.class);
Есть ли способ сделать то же самое - программно загрузка ваших классов сущности - в совместименном виде JPA 2.0?
Причина этого вопроса в том, что я хотел бы динамично Загрузите мой Entity
Классы, таким образом, не обязательно программно.
Решение
С помощью весны я сделал это в совместимом JPA.
Моя «настойчивость .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<String> entityClasses = r.getStore().getTypesAnnotatedWith(Entity.class.getName());
Set<String> 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;
}
}
Затем я корректировал свой весенний контекст XML, как это:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</bean>
</property>
<property name="persistenceUnitName" value="GenericPersistenceUnit"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
<property name="persistenceUnitPostProcessors">
<list>
<bean class="com.austinmichael.core.repository.ReflectionsPersistenceUnitPostProcessor">
<property name="reflectionsRoot" value="com.austinmichael"/>
</bean>
</list>
</property>
</bean>
Обратите внимание на оформление ReflectionsPersistenceUnitPostProcessor
в настройке персистеэнтенпостпроцессоров.
Вот и все. Каждый класс с организацией JPA или MappedSuperclass
Аннотация на классов добавляется в класс. Я должен был дать размышления с префиксом имени пакета для сканирования, поскольку почему com.austinmichael
Есть вообще. Вы могли бы зарегистрировать вторую ReflectionsPersistenceUnitPostProcessor
С другим префиксом имени пакета, если вы хотите, если ваши объекты не делятся общим префиксом имени пакета.
Но теперь это jpavendor agnostic.
Другие советы
Есть ли способ сделать то же самое - программно загрузка ваших классов сущности - в совместименном виде JPA 2.0?
Нет, это не поддерживается JPA, поэтому вам придется сделать это в определенном способе провайдера. Джеймс Сазерленд описал процесс для EclipseLink в Эта тема так:
Вы можете получить доступ к EclipseLink
ServerSession
изEntityManagerFactoryImpl
(getServerSession()
) и используйте егоaddDescriptor(ClassDescriptor)
илиaddDescriptors()
API, чтобы добавить EclipseLinkClassDescriptor
. Отказ Вам нужно будет построитьClassDescriptor
Мета-данные объекты непосредственно сами (или используйте Mapping Workbench для их создания), так как нагрузка с аннотаций JPA или ORM.XML будет сложнее.
Также взглянуть на это Более поздняя тема Для большего количества образец кода (API выглядит как немного многословного).
использованная литература
Я не думаю, что есть такой вариант - JPA поддерживает сканирование классов для субъектов или явно перечисление классов сущности в сохранении .xml. Поскольку вы используете Hibernate в качестве поставщика постоянства, однако вы всегда можете прибегнуть к коду Hibernate. Посмотреть на HibernateEntityManager
а также HibernateEntityManagerFactory
классы. Вы можете сбрасывать им фабрики менеджера по суждению и менеджерам субъектов и делать обычные гибернации.