Problema com o hibernate.properties e arquivo JAR?

Tenho uma aplicação que usa o Hibernate e será distribuida em um arquivo JAR. Essa aplicação poderá conectar a bancos de dados diferentes, ou seja o arquivo hibernate.properties deverá ser configurado na mão dependendo do cenário onde a aplicação for utilizada.
Esta armado o problema: As classes da aplicação que estão DENTRO DO ARQUIVO JAR precisão enxergar o arquivo hibernate.properties que esta FORA DO ARQUIVO JAR.

Teria alguma forma de fazer isso? Agradeço qualquer ajuda.

Que IDE você está usando? Não tem como você adicionar uma referência do seu arquivo no classpath para que ele possa ser enxergado por suas classes? Eu to engatinhando no hibernate…tentando pôr ele pra rodar com Spring…vamos nos ajudar? hehe

Abraços,

Silvio Luiz

[quote=legionarioba]Que IDE você está usando? Não tem como você adicionar uma referência do seu arquivo no classpath para que ele possa ser enxergado por suas classes? Eu to engatinhando no hibernate…tentando pôr ele pra rodar com Spring…vamos nos ajudar? hehe
[/quote]

O classpath não é o problema, nem a IDE, pois o arquivo JAR será utilizado em qualquer IDE ou aplicação. A questão é fazer as classes de dentro do JAR enxergarem o hibernate.properties que ficará fora do JAR.

O hibernate.properties tem mesmo que ficar fora do jar? Assim, se ficasse dentro do jar não poderia ser manipulado ou foi questão de organização sua mesmo ? Me tira até esta dúvida, eu estou usando ao invés do hibernate.properties o hibernate.cfg.xml (mas ai acho não alteraria nada quanto a esse problema ). Tem algo parecido que acontece com o Spring, vou procurar pra ver se posto aqui, mas é basicamente esta estrutura:

<beans>
<bean id =“sessionFactory” class=“org.springframework.orm.hibernate.LocalSessionFactoryBean”>
<property name=“mappingResources”>
<list>
<value>classpath$.app/map/Agencia.hbm</value>
<value>classpath$.app/map/Bairro.hbm</value>
<value>classpath$.app/map/Banco.hbm</value>
<value>classpath$.app/map/Caixa.hbm</value>
</list>
</property>
<bean>
</beans>

Esse é um trecho de um arquivo de config do Spring usando Hibernate. Para enxergar os hbm’s se fazia algo parecido com o que ai esta descrito…

Sim, o hibernate.properties ou hibernate.cfg.xml tem que ficar fora do JAR, pois dependendo do cliente a aplicação usará um banco de dados diferente. Desta forma os parâmetros de configuração do hibernate poderão ser feitos de forma flexível, o que não ocorreria se o arquivo de configuração do hibernate ficasse dentro do JAR.
Percebe a problemática da situação?

É …entendo…mas você pretende através de sua aplicação criar novas configurações? Caso não, você poderia talvez usar mais de um properties…Ao menos com o hibernate.cfg.xml sei que você pode criar um programaticamente…

Aproveitando a deixa, você sabe como é o princípio das Proxy Classes? Quando usar, como elas funcionam…

Abraços,

Silvio Luiz

Amigo !

Tem um método…acho que do PageContext, chamado getPath, que retorna o caminho relativo até a pasta onde está seu projeto. Ai depois é só você concatenar para o caminho que está relacionado com o seu arquivo de properties. Vou tentar achar o link do post onde eu encontrei essa “resposta”…hehe

Cara, no software que estamos desenvolvendo precisamos implementar essa mesma funcionalidade, mas resolvemos de forma diferente a criar um properties para cada cliente.

databases.properties:
clienteX.db = urldadatabaseX
clienteY.db = urldadatabaseY

No login do cliente é possível saber de qual empresa ele pertence, então pegamos os dados do arquivo databases.properties e passamos como parâmetro para a construção da SessionFactory:

Properties p = new Properties();
p.setProperty( "hibernate.connection.url", url);

Configuration conf = new Configuration().setProperties( p );
factory = conf.configure().buildSessionFactory();

Algo semelhante não resolve seu problema?

[quote=LIPE]Cara, no software que estamos desenvolvendo precisamos implementar essa mesma funcionalidade, mas resolvemos de forma diferente a criar um properties para cada cliente.

Algo semelhante não resolve seu problema?[/quote]

Eu tinha conseguido resolver o problema quase da mesma maneira que vc sugeriu. De qualquer forma, obrigado pela dicas.

Posta ai como foi sua solução… :mrgreen: Eu procuro hj à noite a q falei e posto tb :slight_smile:

Minha solução consiste em uma classe que implementa o pattern singleton chamada HIbernateInit, feita de forma que seu construtor receba um parâmetro que é o path do arquivo de configuração do hibernate e que será usado para inicializar a configuração do hibernate.
Com isso eu consigo empacotar tudo em um JAR e quando importa-lo no meu projeto e instanciar a esse submodulo passando o path do hibernate.properties específico tudo funciona.

[code]public final class HibernateInit {

private static HibernateInit instance;
private static SessionFactory sessionFactory;

public static void initialize(String path) {
	if (instance == null) {
		instance = new HibernateInit(path);
	}
}

public static SessionFactory getSessionFactory()
	throws HibernateException {
	return sessionFactory;
}

private HibernateInit(String path) {
	try {

		FileInputStream in = new FileInputStream(path);
		Properties hibernateProperties = new Properties();
		hibernateProperties.load(in);
		in.close();

		Configuration cfg = new Configuration();
		cfg.addClass(Organizacao.class);
		cfg.addClass(Papel.class);
		cfg.addClass(Usuario.class);
		cfg.addClass(ControleAcesso.class);
		cfg.addClass(Sistema.class);
		cfg.addClass(UnidadeOrganizacional.class);
		cfg.addProperties(hibernateProperties);

		sessionFactory = cfg.buildSessionFactory();

	} catch (HibernateException e) {
		System.out.println("[ERRO] -> HibernateInit.HibernateInit()");
		System.out.println("HibernateException: " + e.getMessage());

	} catch (Exception e) {
		System.out.println("[ERRO] -> HibernateInit.HibernateInit()");
		System.out.println("Exception: " + e.getMessage());

	}
}

}[/code]