Мэппинги Hibernate под JBoss
От: BMulder  
Дата: 20.01.08 23:49
Оценка:
Здравствуйте!
Вот такой вопрос: требуется динамически работать с мэппингами hibernate'a под JBoss'ом.
В чистом хибернейте все просто:
Configuration configuration = new Configuration().configure();
configuration.addDocument(document);
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();

,где document — xml документ с мэппингом.

А как быть, если приложение работает под JBoss и использует ejb3 EntityManager, как и где там добраться до hibernate Configuration?
Нужно, чтобы при деплое приложения можно было динамически формировать/изменять мэппинг. Причем мэппинги в .hbm.xml, а не в аннотациях.


Очень признателен за будущие ответы!
Re: Мэппинги Hibernate под JBoss
От: Blazkowicz Россия  
Дата: 21.01.08 12:57
Оценка:
Здравствуйте, BMulder, Вы писали:

BM>А как быть, если приложение работает под JBoss и использует ejb3 EntityManager, как и где там добраться до hibernate Configuration?

BM>Очень признателен за будущие ответы!
Помоему Ejb3Configuration в Reference
Re[2]: Мэппинги Hibernate под JBoss
От: BMulder  
Дата: 30.01.08 22:43
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Помоему Ejb3Configuration в Reference


Да, но где его ловить? Писать самому замену HibernatePersistence? Я написал его наследника, однако во-первых внутри EJB3Configuration стоит проверка имени класса провайдера на то, чтоб он начинался на org.hibernate.ejb.HibernatePersistence (зачем проверять именно startsWith(), а не все имя класса, мне непонятно). А, во-вторых, даже после того, как я назвал свой класс org.hibernate.ejb.HibernatePersistenceMy,при деплое приложения JBoss просто замирает после разбора аннотаций и мэппингов.
Вопрос — где-же правильно работать с EJB3Configuration? Писать самому persistence provider? Если да, то есть ли у кого-нибудь подобный опыт?
Спасибо!
Re: Мэппинги Hibernate под JBoss
От: avpavlov  
Дата: 31.01.08 12:36
Оценка:
У нас стояла задача добавить сохранение всех версий определенных бинов. Для этого на лету добавляются динамические (xml-based) мэппинги. Вот класс, который подключается как раз позволяет добавить некоторые мэпинги при старте приложения.

package com.texunatech.versions;

import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitInfo;
import java.util.HashMap;
import java.util.Map;

import com.texunatech.versions.VersionsTraceable;
import org.hibernate.ejb.Ejb3Configuration;
import org.hibernate.ejb.HibernatePersistence;

/**
 * Author: Alexander Pavlov
 * Company: Texuna Technologies
 * Date: 29-Nov-2007
 * Time: 12:27:09
 */
public class VersionsAwarePersistence extends HibernatePersistence {

    @Override
    public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map overridenProperties) {
        return new ConfigurationInvokeWrapper(overridenProperties).configure(persistenceUnitName);
    }

    @Override
    public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map overridenProperties) {
        return new ConfigurationInvokeWrapper(overridenProperties).configure(info);
    }

    @Override
    public EntityManagerFactory createEntityManagerFactory(Map properties) {
        throw new IllegalAccessError("This method does not allow to configure versions control so should not be used!");
    }

    public static class ConfigurationInvokeWrapper {
        private Map originalProperties;
        private Map properties;
        private boolean keepOriginalPersistenceProviderName;
        private String originalPersistenceProviderName;

        public ConfigurationInvokeWrapper(Map originalProperties) {
            this.originalProperties = originalProperties;
            keepOriginalPersistenceProviderName = originalProperties != null && originalProperties.containsKey(HibernatePersistence.PROVIDER);
            properties = originalProperties != null ? originalProperties : new HashMap();
            originalPersistenceProviderName = (String)properties.put(HibernatePersistence.PROVIDER, HibernatePersistence.class.getName());
        }

        public EntityManagerFactory configure(String persistenceUnitName) {
            try {
                return configureVersionControl(new Ejb3Configuration().configure(persistenceUnitName, properties));
            } finally {
                onFinally();
            }
        }

        public EntityManagerFactory configure(PersistenceUnitInfo info) {
            try {
                return configureVersionControl(new Ejb3Configuration().configure(info, properties));
            } finally {
                onFinally();
            }
        }

        private EntityManagerFactory configureVersionControl(Ejb3Configuration configured) {
            if (configured == null) {
                return null;
            }

            VersionsTrackingManager trackingManager = new VersionsTrackingManager();
            trackingManager.setVersionedObjectsInterface(VersionsTraceable.class);
            trackingManager.configureVersionsTracking(configured.getHibernateConfiguration());

            return configured.buildEntityManagerFactory();
        }

        private void onFinally() {
            if (keepOriginalPersistenceProviderName) {
                originalProperties.put(HibernatePersistence.PROVIDER, originalPersistenceProviderName);
            }
        }
    }
}
Re[2]: Мэппинги Hibernate под JBoss
От: avpavlov  
Дата: 31.01.08 12:37
Оценка:
подключается в persistence.xml так


    <persistence-unit name="userDatabase">
        <!--
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        -->
        <provider>com.texunatech.versions.VersionsAwarePersistence</provider>
    ....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.