Здравствуйте!
Вот такой вопрос: требуется динамически работать с мэппингами 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, а не в аннотациях.
Очень признателен за будущие ответы!
Здравствуйте, BMulder, Вы писали:
BM>А как быть, если приложение работает под JBoss и использует ejb3 EntityManager, как и где там добраться до hibernate Configuration?
BM>Очень признателен за будущие ответы!
Помоему
Ejb3Configuration в
Reference
Здравствуйте, Blazkowicz, Вы писали:
B>Помоему Ejb3Configuration в Reference
Да, но где его ловить? Писать самому замену HibernatePersistence? Я написал его наследника, однако во-первых внутри EJB3Configuration стоит проверка имени класса провайдера на то, чтоб он начинался на org.hibernate.ejb.HibernatePersistence (зачем проверять именно startsWith(), а не все имя класса, мне непонятно). А, во-вторых, даже после того, как я назвал свой класс org.hibernate.ejb.HibernatePersistenceMy,при деплое приложения JBoss просто замирает после разбора аннотаций и мэппингов.
Вопрос — где-же правильно работать с EJB3Configuration? Писать самому persistence provider? Если да, то есть ли у кого-нибудь подобный опыт?
Спасибо!
У нас стояла задача добавить сохранение всех версий определенных бинов. Для этого на лету добавляются динамические (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);
}
}
}
}
подключается в persistence.xml так
<persistence-unit name="userDatabase">
<!--
<provider>org.hibernate.ejb.HibernatePersistence</provider>
-->
<provider>com.texunatech.versions.VersionsAwarePersistence</provider>
....