Вопрос

С 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, чтобы добавить EclipseLink ClassDescriptor. Отказ Вам нужно будет построить ClassDescriptor Мета-данные объекты непосредственно сами (или используйте Mapping Workbench для их создания), так как нагрузка с аннотаций JPA или ORM.XML будет сложнее.

Также взглянуть на это Более поздняя тема Для большего количества образец кода (API выглядит как немного многословного).

использованная литература

Я не думаю, что есть такой вариант - JPA поддерживает сканирование классов для субъектов или явно перечисление классов сущности в сохранении .xml. Поскольку вы используете Hibernate в качестве поставщика постоянства, однако вы всегда можете прибегнуть к коду Hibernate. Посмотреть на HibernateEntityManager а также HibernateEntityManagerFactory классы. Вы можете сбрасывать им фабрики менеджера по суждению и менеджерам субъектов и делать обычные гибернации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top