Я использую управляемую персистентность контейнера EJB3, т.е. EntityManager внедряется с помощью аннотации @PersistenceContext.Постоянный контекст затем может распространяться на вложенные EJB-компоненты.Транзакциями также управляет contaner (glassfish).
Обычно я помещаю файл persistence.xml в каталог META-INF, и контейнер определяет, какого поставщика использовать и как настроить EntityManagerFactory (основанный на специфичном для hibernate).Свойства).
Моя проблема заключается в том, что мне нужно подключиться к процессу настройки EntityManagerFactory.В частности, мне нужно изменить значения дискриминатора в некоторых PersistentClasses до того, как EntityManagerFactory получит configure'ed (заморожен для любого изменения).
Это то, как я делаю это с Spring, но мне нужно сделать то же самое с чистым EJB3 CMP (илиможет быть с помощью Spring).
public class AnnotationSessionFactoryBean extends org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean {
/** Log4j logging instance. */
protected static Logger log = Logger.getLogger(AnnotationSessionFactoryBean.class);
//some data preloaded from the database using jdbc
private Map<String, DatabaseConfiguration> configs;
@Override
protected void postProcessAnnotationConfiguration(AnnotationConfiguration config) throws HibernateException {
//Load and process dynamic Mappings.
Iterator classMappingsIter = config.getClassMappings();
while(classMappingsIter.hasNext()) {
PersistentClass persistentClass = (PersistentClass) classMappingsIter.next();
String discriminatorValue = persistentClass.getDiscriminatorValue();
if(discriminatorValue != null) {
log.debug("DiscriminatorValue before [" + discriminatorValue + "]");
//here I replace discriminator values.
//The Discriminator values are coded in the annotations
//as names (words). These words need to be replaced with ids
//previously loaded from the database using jdbc.
//The names are constant in all environments, however the ids are
//are different.
discriminatorValue = StringUtil.replacePlaceholders(discriminatorValue, configs);
persistentClass.setDiscriminatorValue(discriminatorValue);
log.debug("DiscriminatorValue after [" + discriminatorValue + "]");
}
}
super.postProcessAnnotationConfiguration(config);
}
/**
* @return the configs
*/
public Map<String, DatabaseConfiguration> getConfigs() {
return configs;
}
/**
* @param configs the configs to set
*/
public void setConfigs(Map<String, DatabaseConfiguration> configs) {
this.configs = configs;
}
}
Заранее спасибо, Антон