Использование Hibernate Ejb3Configuration с управлением контейнерами - PullRequest
0 голосов
/ 03 июня 2011

Есть ли способ использовать программную конфигурацию, предоставляемую Ejb3Configuration, с управлением контейнерными объектами?Я хотел бы динамически добавлять (дополнительные) аннотированные классы, которые были обнаружены через ServiceLoader после обработки файла persistence.xml.

Я попытался расширить HibernatePersistence, переопределяя метод createContainerEntityManagerFactory, где я добавил функциональность для добавления классов, но обнаружил две проблемы: 1) Когда я пытаюсь вызвать экземпляры EjbConfiguration, сконфигурируйте (PersistenceUnitInfo, Map) метод в новомPersistenceProvider, я получаю нулевое возвращение.2) Я получаю NPE сервером приложений (как GF 3.0.1, так и GF 3.1) при завершении работы приложения, происходящем из org.glassfish.persistsnce.jpa.JPAApplicationContainer.closeAllEMFs или org.glassfish.persistence.jpa.JPADeployer.closeEMFsсоответственно

Вот мой PersistenceProvider:

//left out createEntityManagerFactory for brevity

public class DynamicEntityProvider extends HibernatePersistence {

    @Override
    public EntityManagerFactory createContainerEntityManagerFactory 
        (PersistenceUnitInfo info, Map props) {

        final Ejb3Configuration config = new Ejb3Configuration();
        final Ejb3Configuration configured = config.configure(info, props);

        if (configured != null) {
            //never gets here, configured is always returned null
            addDynamicEntities(configured);
            return configured.buildEntityManagerFactory();
        }
        //logging code which notifies me that configured was null
        return null;
    }

    //addDynamicEntities() method impl

Я просто заменяю тег в моем файле persistence.xml на класс, и он действительно вызывается, как и ожидалось ... просто спроблемы, перечисленные выше =)

Любые идеи будут с благодарностью!

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Я не знаю, решили ли вы уже свою проблему, но ...

Возвращает ноль, потому что класс HibernatePersistence, который вы расширяете, проверяет, не установлен ли для файла persistence.xml провайдер, установленный на него, а неподкласс, поэтому он не распознает ваш класс (DynamicEntityProvider) в качестве поставщика, поэтому он не анализирует ваш xml.

if ( metadata.getProvider() == null || IMPLEMENTATION_NAME.equalsIgnoreCase(metadata.getProvider()) ) {

Где IMPLEMENTATION_NAME равен

private static final String IMPLEMENTATION_NAME = HibernatePersistence.class.getName();

Вы можете изменитьэто внутренне через отражение, но это не «хороший» способ сделать это.

1 голос
/ 05 июня 2011

Похоже, какая-то проблема видимости загрузчика классов.Я знаю, что GF использует связывание OSGi, поэтому я не совсем удивлен.

В основном config.configure возвращает ноль, если не находит, что единица персистентности, описанная в информации, соответствует поставщику персистентности в игре.Попробуйте отобразить информацию и посмотрите, правильно ли настроен поставщик сохраняемости, и следите за проблемами загрузчика классов (т.е. myClass! = YourClass, если загрузка CL не совпадает)

...