2013-10-03 25 views
9

Düzenleme: not duplicate but almostpersistence.xml

ben basit gelen bu yer tutucu değerler alma gibi bir şey

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
       http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
       version="1.0"> 
    <persistence-unit name="appName" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="${db.dialect'}"/> 
      <property name="javax.persistence.jdbc.driver" value="${db.driver}"/> 
      <property name="javax.persistence.jdbc.user" value="${db.user}"/> 
      <property name="javax.persistence.jdbc.password" value="${db.password}"/> 
      <property name="javax.persistence.jdbc.url" value="${db.url}"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

olmak benim app persistence.xml istiyorum kaynak klasörlerimde bir yere metin dosyası.

Sadece Hazırda ve bazı Primefaces,

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:com/foo/jdbc.properties</value> 
    </property> 
</bean> 

gibi yapıyor ama burada biz bahar kullanmayan Bahar kullanarak zaman mümkün olduğunu okumuştum.

Mümkün mü?

Teşekkürler!

Düzenleme: Bazı şeylerden bahsetmedim, ancak referans olarak, bazı şeyleri yapmak için Shiro Security ve Ant'i de kullanıyorum. Çözümü bir cevap olarak göndereceğim. (Ant Flyway görevler için)

  • persistence.xml (hazırda)
  • context.xml (Shiro)
  • database.properties: Bu benim projem veritabanı parametreleri ile 3 farklı dosya var kılan

cevap

1

I Shiro Güvenlik, t kullanıyorum söz düzenlendi: anahtar = değer), örneğin, createEntityManagerFactory() yöntemine bir Properties nesne geçmesi şapka da bazı veritabanı parametrelerine ihtiyaç duyar. Ben bağlamında bu kalmak yaparken sadece 1 veritabanı parametreleri konuma ihtiyacım var ve diğerlerinde başvuran.

1) karınca context.xml

context.xml

<target name="init-flyway"> 
    <property name="flyway.url" value="${Resource.url}" /> 
    <property name="flyway.user" value="${Resource.username}" /> 
    <property name="flyway.password" value="${Resource.password}" /> 
    <!-- stuff stuff stuff --> 
</target> 
kullanarak erişim sonra karınca build.xml

<xmlproperty file="/path/to/context.xml" keepRoot="false" semanticAttributes="true" includeSemanticAttribute="true" /> 

kullanarak ve yoktu

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <!-- Other stuff... --> 

    <!-- Shiro's --> 
    <Resource name="jdbc/postgres" auth="Container" 
     type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" 
     url="jdbc:postgresql://url-to-db/database" 
     username="user" password="pass" /> 
</Context> 

sahip okuma

2) persistence.xml bağlamı oku.xml

O

<non-jta-data-source>java:/comp/env/jdbc/postgres</non-jta-data-source> 

Yani, 3 veritabanı parametrelerini için yardım sadece 1.

Teşekkür öldürdü this

kullanarak bağlam en datastore kullanmak mümkündür!

2

Maven'i yapı sistemi olarak kullanıyorsanız, oluşturma süresi boyunca değerleri değiştirmek için Maven filtrelerini kullanabilirsiniz.

Yoksa (dahili yay kendisi tarafından kullanılır) basit özellik tutucu değiştirme yazabilirsiniz

Referans: https://stackoverflow.com/a/14724719/477435

+0

Aslında bunu yapmak için Ant kullanıyoruz. Üzgünüm, ama sanırım yanlış anladım ... Bazı yer tutuculara değer katmak için bir Java sınıfı kullanmayı mı düşünüyorsunuz? – paulochf

+0

Aslında, özellik dosyasından okuyarak yer tutucu değerlerini değiştirebilen bir Java sınıfı kullanmayı deniyordum. Ancak, aşağıda verilen yanıtın, persistence.xml kullanımını ortadan kaldırabileceğiniz ve yalnızca bir özellik dosyası kullanabileceğiniz daha iyi olduğu öne sürüldü. – Gireesh

15

persistence.xml içindeki özelliklerini tanımlayan Eğer (standart özellikler dosyası bunları tanımlayabilirsiniz yerine

Properties props = new Properties(); 
props.load(new FileInputStream("/some/path/persistence.properties")); 
EntityManagerFactory factory = Persistence.createEntityManagerFactory("appName", props); 
+0

Sadece, eğer çözümümü bulamamış olsaydım kesinlikle bunu kullanırdım. – paulochf

+4

sadece bir hatırlatma. Özellikler dosyasında, mülk adının tamamını kullanmayı unutmayın. "javax.persistence.jdbc.user" yerine, sadece "kullanıcı" yerine – McCoy

+0

neden? Neden bunu daha önce bulamadım? –