Einstellung der JPA-Persistenz-Eigenschaften dynamisch
Sagen wir, ich habe folgende persistence.xml mit der Verbindungs-url, user & Passwort alle hart codiert.
Folgende ist für Hibernate 3.2. Für Hibernate 3.5 ++, wir müssen uns ändern "hibernate.Verbindung" auf "javax.Persistenz". Aber lassen Sie mich Fragen, diese Frage unabhängig von der Literale "hibernate.Verbindung" oder "javax.Persistenz".
<persistence-unit name="obamacare" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
<property name="hibernate.connection.url" value="blah blah blah"/>
<property name="hibernate.connection.username" value="careuser"/>
<property name="hibernate.connection.password" value="carepass"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Jedoch, wir müssen den url, user & Passwort dynamisch. Es gibt eine geplante Authentifizierungs-server, der dazu dient die url, user & Passwort. So dass wir nicht brauchen, individuell zu konfigurieren, die Myriaden von webapps, die mit irgendeiner form von jdbc, hibernate oder JPA. Neben der Frage der Sicherheit nicht wollen, um zu speichern/verwalten-Passwörter auf sichtbaren text-Dateien.
Soweit JPA betroffen ist, wie kann ich diesen PPV Eigenschaften dynamisch? Ich Suche zwei Sätze von Antworten:
-
Für Sie eine Lösung, die JPA-vendor independent (toplink, eclipselink, hibernate, etc) - gibt es eine JPA-Funktionalität, die würde lassen Sie mich diese drei Eigenschaften dynamisch?
-
Wenn ich darf, hängt völlig auf Hibernate, neben der möglichen PPV nur avenue, gibt es eine Möglichkeit, dieses Ziel zu erreichen, ohne über das Spring-framework (das scheint wie ein riesiges Ungeheuer mit Tentakeln, die alle über den Ort)?
Ich wäre begeistert, wenn Sie auch wollen, um zu werfen in zwei-Cent/Pfund/Euro auf JNDI und wie konnte ich es verwenden, um ersetzen Sie die Funktionalität von persistence.xml Eigenschaften. Das ist aber nicht die Priorität der Frage.
- Die meisten der Dinge, die Sie erreichen wollen, kann leicht getan werden mit Frühling. Ich bin mit der Feder für ein paar Wochen und ich bereue den switch überhaupt. Der Frühling scheint wie eine große Last von Arbeit, aber es ist eigentlich ganz einfach.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, wie Sie bootstrappen EntityManagerFactory. Die 2-Spezifikation definiert Methoden, die jedem erlauben, Sie zu übergeben in java.util.Anzeigen der Werte. Diese Werte sollen Vorrang vor angegebenen Werte in der persistence-unit.
In der "SE-Konzept" kein problem, da der bootstrap-Prozess ist in der Regel gesteuert durch Ihre app:
javax.persistence.Persistence#createEntityManagerFactory(String puName, Map config
. Nun werden Sie vielleicht Probleme haben, Sie hier, wenn etwas anderes (ähem, Frühling) ist das "Management" der EMB für Sie...In der "EE-Ansatz" ich bin mir nicht bewusst eine gute Globale Ansatz. Das Anzeigen der Werte gibt es noch in den bootstrapping, aber das problem ist, dass die EE-container ist das ein Aufruf dieser Methode.
Einer Hibernate-spezifische Ansatz, der funktionieren würde in jedem Fall würde die config-variable Ersatz. Also in deinem persistence-unit würden Sie definieren, Benutzername oder Passwort verwenden
${some.key}
und Hibernate ersetzen würden, diese für Sie. Ob dies funktionieren würde durch die wirklich hängt davon ab, wie Sie möchten, legen Sie diese Werte letztlich; Hibernate muss noch der Zugriff auf eine config-Wert mit dem Namensome.key
für diese zu arbeiten...Weiteren "globalen Ansatz"... Die "EE-Ansatz", um die bootstrap-EMF ist für die container zu instanziieren, die die javax.die Persistenz.spi.PersistenceProvider und rufen Sie seine javax.die Persistenz.spi.PersistenceProvider#createContainerEntityManagerFactory. createContainerEntityManagerFactory hat eine interessante Signatur hier. Im wesentlichen ist es vergangen ein javax.die Persistenz.spi.PersistenceUnitInfo, die eine Objekt-Repräsentation des geparsten persistence unit plus einige andere Sachen. Eine option wäre die Nutzung dieser Ansatz von bootstrap und übergeben eine Instanz von javax.die Persistenz.spi.PersistenceUnitInfo, die Sie konstruieren Ihr selbst. javax.die Persistenz.spi.PersistenceProvider ist eine Schnittstelle. Zum instanziieren, würden Sie brauchen, zu wissen, den Anbieter, den Sie verwenden möchten, und die FQN Ihrer impl. Aber das ist normalerweise kein problem, da diese sind ziemlich gut bekannt.
Sind Sie insbesondere Fragen über die JDBC-Verbindung erstellen/pooling. Haben Sie zusätzliche Möglichkeiten, es konkret. Sie können Ihre "credential service" erstellen von Datenquellen und Ihre JPA-provider verwenden Sie einfach die Datenquelle. Alle JPA-Provider unterstützen das Auffinden DataSources per JNDI-lookup. In "EE bootstrapping" - Anbieter können auch weitergegeben werden, eine Datenquelle zu verwenden, die über PersistenceUnitInfo#getJtaDataSource und/oder PersistenceUnitInfo#getNonJtaDataSource. Hibernate abwechselnd übernimmt eine DataSource-Instanz an die Stelle der typischen DataSource JNDI-Namen-Einstellung. Wenn Sie nicht möchten, zu verwenden DataSource (aus irgendeinem Grund), ein Hibernate-spezifische alternative ist die Implementierung von Hibernate ist ConnectionProvider Vertrag selbst, ist dies der Vertrag (interface) Hibernate verwendet zu erhalten und die Freisetzung von JDBC-verbindungen bei Bedarf. Die Umsetzung ConnectionProvider Sie können die zugrunde liegenden Verbindungen in irgendeiner Weise, die Sie wollte.
Viele Möglichkeiten 🙂
<property name="hibernate.connection.username" value="careuser"/>
, so dass Sie stattdessen sagen würden<property name="hibernate.connection.username" value="${the.db.user}"/>
. Wie ich schon sagte, Sie müssen nochthe.db.user
definiert werden als eine Eigenschaft, die irgendwo zugänglich zu überwintern. System-Eigenschaft vielleicht. Schwer zu geben, Einzelheiten, ohne zu wissen mehr darüber, wie Sie bootstrap.Ihre zweite Frage kann ich ein Hibernate-Lösung.