2017-02-13 116 views
0

我需要配置hibernate以從karaf上的OSGI捆綁包上的自定義位置加載hibernate.cfg.xml。我需要能夠在不編輯JAR文件的情況下編輯配置,這似乎是唯一可用的選項。我正在使用以下類來加載Hibernate SessionFactory,如hibernate文檔中所述,但似乎無法在Hibernate OSGI模塊公開的此服務返回的SessionFactory上對其進行配置。我一直在研究這個問題幾天,但我找不到解決方案。我正在使用Hibernate 4.3.11.Final。任何幫助非常感謝,謝謝在KARAF OSGI Bundle上定製hibernate.cfg.xml位置

公共類的HibernateUtil {

private static SessionFactory sf; 

public static Session getSession() { 
    return getSessionFactory().openSession(); 
} 

private static SessionFactory getSessionFactory() { 
    if (sf == null) { 
     Bundle thisBundle = FrameworkUtil.getBundle(HibernateUtil.class); 

     BundleContext context = thisBundle.getBundleContext(); 

     ServiceReference sr = context.getServiceReference(SessionFactory.class.getName()); 
     sf = (SessionFactory) context.getService(sr); 
    } 
    return sf; 
} 
+0

我使用Hibernate 4.3.11.Final –

回答

0

後的工作和下面的許多不同的線索,我能夠解決的問題很多天。主要想法是將數據庫連接屬性存儲在hibernate.cfg.xml文件之外,該文件必須位於JAR文件內部以供Hibernate OSGI查找。相反,屬性文件可以位於任何你喜歡的地方。爲了實現這一藍圖,使用定義JNDI服務,然後配置上,使用下列標記的hibernate.cfg.xml的JNDI服務:

<property name="connection.datasource">osgi:service/jdbc/mysqlds</property> 

定義與藍圖的JNDI服務的代碼如下:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
     <property name="driverClass" value="${db.driverClass}"/> 
     <property name="url" value="${db.url}"/> 
     <property name="username" value="${db.username}"/> 
     <property name="password" value="${db.password}"/> 
    </bean> 


<service interface="javax.sql.DataSource" ref="dataSource"> 
    <service-properties> 
    <entry key="osgi.jndi.service.name" value="jdbc/mysqlds"/> 
    <entry key="datasource.name" value="MySqlDS"/> 
    </service-properties> 
</service> 

重要的是要提到我嘗試使用許多不同的DataSource類,這些類通常會因classnotfound錯誤而失敗。唯一爲我工作的是SimpleDriverDataSource