2015-10-16 40 views
8

我正在使用hibernate編寫一個javaEE應用程序。該應用程序將在多個環境(dev,qa,prod等)上運行。&將具有與每個環境相關聯的單獨dbs。我想爲每個環境分別設置hibernate屬性,如jdbc-url,username,password等。Hibernate JTA:每個環境讀取數據庫連接參數

我現在persistence.xml樣子:

<persistence-unit name="PU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <validation-mode>CALLBACK</validation-mode> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="validate" /> 

      <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/> 
      <property name="hibernate.event.merge.entity_copy_observer" value="allow"/> 

      <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/> 
      <property name="hibernate.connection.url" value="jdbc:oracle:thin:@host/schema"/> 

      <property name="hibernate.connection.username" value="abc"/> 
      <property name="hibernate.connection.password" value="***"/>  

     </properties> 
    </persistence-unit> 

我使用的持久性單元在我的Java代碼如下:

@PersistenceContext(unitName = "PU") 
private EntityManager em; 

有沒有辦法,我可以注入休眠特性的一種方式,其存儲在單獨的屬性文件中,進入不同環境的EntityManager?

請注意,我使用JTA,因此無法使用EntityManagerFactory。我也不是&不想用春天。

+0

時,你的意思是不同的環境,你不包括應用服務器?因爲數據源/數據庫屬性將由應用程序服務器共享,所以生產服務器將具有生產數據庫屬性,並且開發服務器將具有開發屬性 – AntJavaDev

+0

是的。應用程序在不同的環境中也會有不同的虛擬機。 –

+0

然後你應該讓hibernate conf依賴於服務器的數據源conf,f.e.如果你有一個tomcat服務器,你應該定義3個不同的數據庫上下文 – AntJavaDev

回答

1

由於您不想使用外部庫(如Spring)來引導持久性單元,因此爲什麼不使用您的構建系統來執行此操作。如果您正在使用maven,則可以使用maven filteringprofiles的混合來根據屬性文件進行過濾,或者如果您正在使用任何其他構建工具,則可以添加一個任務(或等效項)以將文件內容從不同文件複製到實際文件取決於一些外部系統/環境變量。

0

使用Spring Profile您可以啓動實體管理器bean,具體取決於將引用persistence.xml的活動配置文件,如您的環境的dev-persistence.xml, test-persisitence.xml, prod-persistence.xml。您可以使用web.xml設置活動配置文件。大多數情況下,web.xml不會改變那麼多,所以你可以使用爲該環境設置的spring profile激活屬性將web.xml保存在存儲庫中。

5

這實在是一個BAAAAAAD主意,包括在應用程序WAR/EAR包特定的環境信息(或者通過包括多個CONFIGS,或者通過創造不同的環境不同的包)。例如,不同的數據庫應該保存在容器中。

在你的情況,你的persistence.xml應該是這樣的:

<persistence> 
    <persistence-unit name="PU"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>jdbc/fooAppDs</jta-data-source> 
     <properties> 
     ... ... 
     </properties> 
    </persistence-unit> 
</persistence> 

,當然你應該有相應的資源引用的jdbc/fooAppDs

通過這樣做,你可以部署在任何環境下你的應用程序。您只需在容器中創建正確的數據源並將其分配給jdbc/fooAppDs


另一種方法,我相信會的工作,雖然我不會推薦,是通過創建類路徑hibernate.cfg.xml。您可能希望擁有本地文件系統位置並將其添加到classpath中,而不是將該文件放入JAR/WAR/EAR中。

1

我們使用物業維修保養文件在不同的文件每個環境,例如DEV,QA,PROD,UAT等,並生成過程中複製其中之一。

Ant構建

<property environment="env" /> 
       <!-- ***** COMMAND LINE ARGUMENTS DEMOED HERE --> 
       <property name="build_type" value= "${env.build_type}"/> 

<copy todir="deploy"> 
    <fileset dir="src_dir"/> 
    <globmapper from=${env.build_type}".persistence.xml" to="persistence.xml"/> 
</copy> 

運行建立這樣

ant -Denv.build_type=PROD 

這將複製到PROD.persistence.xml persistence.xml中

ant -Denv.build_type=DEV 

這將複製DEV.persistence。 xml到persistence.xml

0

你可以配置你的春天-config.xml文件如下

  1. MYSQL
<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/kaya_db" /> 
    <property name="username" value="root" /> 
    <property name="password" value="nxtlife" /> 
</bean> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="packagesToScan" value="com.nxtlife.model" /> 
    <property name="hibernateProperties"> 

     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
</bean> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory"> 
</bean> 

2.Similar其它數據庫,如Oracle,postgre與數據源的不同名稱,sessionfactory和transactionmanager。 3.最後,你可以使用得到會話工廠的對象以下的SessionFactory名

@Modifier("sessionfactoryname") 
@Autowired 
private SessionFactory obj; 

類似針對不同數據庫

+0

正如我在問題中提到的,我沒有使用並且不希望使用spring。 –

+0

哦,我的JPA似乎沒有任何SessionFactory。清楚地重讀這個問題將有助於 –

+0

你可以在jpa中使用EntityManager並設置unitname。 –