Ajouter un paquet supplémentaire pour numériser à l'entité gestionnaire de l'aide de configuration Spring?
J'ai un Spring Batch application qui a un Ressort contexte de configuration qui, normalement, chaque lot de travail de référence. De cette manière, chaque lot de travail utilise la même entité gestionnaire.
batch-context.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<!-- ... -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="myPersistenceUnit" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="packagesToScan" value="com.example.domain" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.jdbc.fetch_size">100</prop>
<prop key="hibernate.jbc.batch_size">1000</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.use_sql_comments">false</prop>
</props>
</property>
</bean>
<!-- ... -->
</beans>
Maintenant dans mon travail par lots contexte (appelons-la ExampleBatch.xml je veux ajouter un autre paquet d'analyse de la déjà défini entityManagerFactory bean. Est-ce possible?
ExampleBatch.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">
<!-- ... -->
<import resource="classpath:batch-context.xml" />
<bean id="entityManagerFactoryWithExtraPackages"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
parent="entityManagerFactory">
<!-- How do I override the packagesToScan property on the already defined entityManagerFactory bean?-->
<property
name="packagesToScan"
value ="com.example.domain,com.example.domain.abstraction"
/>
</bean>
<!-- ... -->
</beans>
La façon que j'ai maintenant ne fonctionnera pas car il se plaint que "No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2
"
Est d'essayer de remplacer le "packagesToScan" bien la bonne démarche à adopter dans ce scénario? Est-il un meilleur moyen d'atteindre ce comportement?
Edit:
J'ai été en mesure d'accomplir ce que j'avais besoin de l'aide de l' property-override
fonctionnalité. Ci-dessous la mise à jour ExampleBatch.xml que je suis allé avec
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">
<!-- ... -->
<import resource="classpath:batch-context.xml" />
<context:property-override properties-ref="entityManagerOverride"/>
<bean id="entityManagerOverride"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<util:properties>
<prop key="entityManagerFactory.packagesToScan">com.example.domain,com.example.batch.module.domain</prop>
</util:properties>
</property>
</bean>
<!-- ... -->
</beans>
La mesure de Printemps ne pas crier à moi que c'est une configuration non valide. N'ont pas encore déterminé si ce est en fait de produire le résultat souhaité.
Edit 2:
Le bien-remplacer la méthode ne semble pas être suffisant. C'est une configuration valide, mais après avoir inspecté le gestionnaire de l'entité au moment de l'exécution comme ceci:
for (EntityType<?> entity : manager.getMetamodel().getEntities()) {
String name = entity.getName();
System.out.println(name);
}
Il ne contient que des entités de la com.exemple.domaine paquet.
Quelqu'un a d'autres idées?
OriginalL'auteur FGreg | 2013-01-16
Vous devez vous connecter pour publier un commentaire.
La façon dont vous l'avez maintenant, vous avez vraiment définir deux haricots appelée
entityManagerFactory
et l'autreentityManagerFactoryWithExtraPackages
.Il y a plusieurs façons de résoudre votre demande:
Simplement se débarrasser de l'une des haricots - fusionner les définitions dans un.
Je ne suppose que ce n'est pas une option pour vous, sinon vous ne demandez pas.
Définir la
entityManagerFactory
abstraite, puis vous finissez par avoir un bean de toute façon.Utiliser la propriété remplacer mécanisme. Cela correspond à des situations où vous n'êtes pas dans le contrôle de la 'top' haricot et malgré que vous souhaitez re-configurer (littéralement remplacer les valeurs des propriétés de l') de haricots qui y sont définies.
Je pensais bien remplacer pourrait fonctionner, mais sur une inspection plus poussée, il ne semble pas se comporter comme prévu. Mon soupçon est que le gestionnaire d'entité se construit quand il est défini dans la batch-context.xml fichier, alors la propriété est remplacée. Depuis le entityManger est déjà créé, il ne scanne pas les paquets. C'est juste une supposition... je ne sais pas si c'est effectivement ce qui se passe.
#1 et #2 ne sont pas des options. Je veux tout autre lot pour être en mesure d'utiliser l'entityManager tel que défini dans batch-context.xml. Je ne veux pas la force de tous les lots d'avoir à configurer le gestionnaire d'entités.
Je sais peu de
spring-batch
, mais je suis sûr que si vous utilisez la propriété remplacer le mécanisme de l'substituée valeur n'est jamais définie, donc fin du Printemps jusqu'en appelant un seul setter une fois (avec la valeur de remplacement). C'est exactement ce que la propriété remplacer " mécanisme est conçu pour. Êtes-vous sûr que leExampleBatch.xml
fichier fait partie du même Ressort du contexte que lebatch-context.xml
?OriginalL'auteur Grzegorz Oledzki
Il suffit de remplacer ce:
:
OriginalL'auteur Vlad-HC
Si elle correspond à vos paquets organisation, vous pouvez essayer
Dans votre batch-context.xml, de sorte que votre ExampleBatch.xml n'a pas plus de "remplacer" le parent.
Une autre façon de creuser est l'aide de l'espace réservé; dans batch-context.xml, vous pouvez utiliser :
tandis que dans ExampleBatch.xml vous pouvez déclarer l'espace réservé avec la valeur appropriée, comme l'explique par exemple ici : http://www.mkyong.com/spring/spring-propertyplaceholderconfigurer-example/
OriginalL'auteur Michael Zilbermann