Können wir den Namen der JTA-Datenquelle in der Eigenschaftendatei festlegen?
-
21-12-2019 - |
Frage
Können wir den JTA-Datenquellennamen in der Eigenschaftendatei festlegen, der in persistance.xml der Anwendung gelesen wird?
Lösung
Es gibt eine weitere, einfachere Möglichkeit, den Namen Ihrer Datenquelle und andere Anwendungsparameter konfigurierbar zu machen.
Dafür verwenden wir Maven-Profile und Ressourcenfilterung.Sie müssen Platzhalter in Ihrem definieren persistence.xml
die mit den Eigenschaftsnamen in Ihrem übereinstimmen .properties
Datei oder in Ihrer .pom
.
Während des Builds geben Sie das Profil an und Maven ersetzt die Platzhalter durch Ihre Eigenschaften.
Wir haben diese Technik zum Wechseln der Datenquelle zwischen verschiedenen Bereitstellungsumgebungen verwendet.
BEARBEITEN:
Definieren Sie zunächst ein Profil für die Ressourcenfilterung:
<profiles>
<profile>
<id>set_datasource</id>
<build>
<!-- enable resource filter to set the datasource name --
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
...
Erstellen Sie für jede Datenquelle ein Profil:
<profile>
<id>db_test</id>
<properties>
<database.name>test_ds</database.name>
</properties>
</profile>
Bereiten Sie in Ihrer Persistenzeinheit den Platzhalter vor
<persistence-unit name="my_db">
<jta-data-source>java:jboss/datasources/${datasource.name}</jta-data-source>
</persistence-unit>
Rufen Sie Maven mit den beiden Profilen auf:
mvn test -Pdatasource,db_test
Andere Tipps
Sie können Werte in Ihrer Datei persistence.xml überschreiben, indem Sie dynamisch eine generieren EntityManagerFactory
verwenden Persistence.createEntityManagerFactory(persistenceUnitName, properties)
, und mit der properties
Map, um den Namen der Datenquelle anzugeben.Jetzt können Sie jedoch niemals eine injizieren EntityManager
verwenden @PersistenceContext
, oder spritzen EntityManagerFactory
verwenden @PersistenceUnit
irgendwo in Ihrer Anwendung, und Sie müssen Ihre EntityManager-Transaktionen manuell verwalten.Tu es nicht.Das ist eine schreckliche Idee.