J'utilise la persistance gérée par conteneur EJB3 dans le cas où un EntityManager est injecté via l'annotation @PersistenceContext. Le contexte persistant peut alors être propagé aux EJB imbriqués. Les transactions sont également gérées par le contaner (glassfish).EJB3 Configuration programmatique CMP + de Hibernate AnnotationConfiguration
Habituellement, je laisserais persistence.xml dans le répertoire META-INF et le conteneur déterminerait quel fournisseur utiliser et comment configurer EntityManagerFactory (basé sur les propriétés spécifiques d'hibernate).
Mon problème est que je dois me connecter au processus de configuration EntityManagerFactory. En particulier, j'ai besoin de changer les valeurs discriminantes dans certaines classes persistantes avant que l'EntityManagerFactory ne soit configuré (figé pour toute modification).
C'est ainsi que je le fais avec Spring, mais j'ai besoin de faire similaire avec EJB3 CMP pur (ou peut-être avec l'aide de 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;
}
}
Merci à l'avance, Anton
Pascal, Je connais les descripteurs XML. J'ai déjà traversé cette solution. Mais c'est juste moche. J'ai tout dans la classe Java (y compris le discriminateur). Je pense que la configuration de PersistentClasses par programme est une meilleure idée que de conserver des tas de fichiers. Une autre raison pour laquelle je dois utiliser une configuration programmatique est de définir le type de collection MultiMap sur certaines collections de cartes OneToMany. J'ai trouvé que c'est la seule façon de le faire lorsque vous utilisez des annotations. En fait, il est facile de faire avec XML hibernate natif, mais pas avec des annotations ni avec des descripteurs XML. – Anton
Comme je l'ai dit, je peux faire tout ce qui précède avec Spring. Cependant, l'EJB3 ne semble pas avoir un tel intercepteur/rappel pour se connecter au processus de configuration. – Anton