/ / Local personalizado do hibernate.cfg.xml em um pacote KARAF OSGI - java, hibernate, osgi, karaf

Local customizado do hibernate.cfg.xml em um pacote KARAF OSGI - java, hibernate, osgi, karaf

Eu preciso configurar o modo de hibernação para carregar ohibernate.cfg.xml de um local personalizado em um pacote OSGI no karaf. Eu preciso ser capaz de editar a configuração sem editar o arquivo JAR, que parece ser a única opção disponível. Eu estou usando a seguinte classe para carregar o Hibernate SessionFactory conforme descrito na documentação de hibernação, mas parece que não há maneira de configurar isso no SessionFactory retornado pelo módulo Hibernate OSGI expondo este serviço. Eu tenho pesquisado este problema vários dias, mas não consigo encontrar uma solução. Eu estou usando o Hibernate 4.3.11.Final. Qualquer ajuda é muito apreciada, obrigado

classe pública 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;
}

Respostas:

0 para resposta № 1

Depois de muitos dias de trabalho e seguindo muitosleads diferentes eu consegui resolver o problema. A idéia principal era armazenar as propriedades da conexão do banco de dados fora do arquivo hibernate.cfg.xml, que deve estar dentro do arquivo jar para que o OSGI do Hibernate o encontre. Pelo contrário, o arquivo de propriedades pode ser localizado em qualquer lugar que você desejar. Para isso, defina um serviço JNDI usando blueprint e, em seguida, configure o serviço JNDI no hibernate.cfg.xml com a seguinte tag:

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

O código para definir o serviço JNDI com blueprint é o seguinte:

<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>

É importante mencionar que eu tentei usar muitas classes DataSource diferentes, que geralmente falham com um erro classnotfound. O único que funcionou para mim foi SimpleDriverDataSource