Hibernate e 2 bancos de dados

9 respostas
R

No hibernate contém no .xml a configuração para a conexão no banco de dados (seria um banco de dados para autenticar o usuário)

Isso está ok, mas preciso que quando se conecte nesse verifique o usuário e direcione para outro banco de dados (conforme o usuário), criaria uma nova conexão com outro banco de dados (poderia expirar a do outro que foi usado para autenticação)

Alguém poderia me explicar o que é usado normalmente?

9 Respostas

L

se vc quer conectar dinamicamente a um banco de dados, vai ter que configurar a conexão na mão, ou seja…

abrir um configuration e ir setando as propertys de drive, banco, senha, usuario, catalogo, schema, etc etc…

R

As duas?

1)Por padrão vem conectado no banco para autenticar
2)Autentico e crio objeto com os dados para conectar no outro bd
3)Desconecto do BD atual
4)Conecto no novo

Isso?

Usando a classe ConnectionFactory?

L

vc desconecta do primeiro c for necessario, se ninguem mais for logar, se é asism que o seu processo exige…

a primeira não precisa ser dinamica, afinal, sempre o mesmo banco …

a segunda é personalisada pelo usuario, então as propriedades de conexão devem ser injetadas dinamicamente.

R

Teria algum exemplo ou material para disponibilizar?

G

Você pode usar o hibernate shards. https://www.hibernate.org/414.html

J

Rafael,

O Hibernate pode ser configurado para quantos bancos de dados diferentes forem necessários.
Basta você criar mais de um arquivo de configuração "raiz".

Exemplo:

hibernate.cfg.xml
<hibernate-configuration>
	<session-factory name="banco1">
<!-- propriedades, mapeamentos, etc -->
	</session-factory>
</hibernate-configuration>
hibernate2.cfg.xml
<hibernate-configuration>
	<session-factory name="banco2">
<!-- propriedades, mapeamentos, etc -->
	</session-factory>
</hibernate-configuration>

Dai, você deve trabalhar com 2 objetos do tipo org.hibernate.SessionFactory, um para cada tag ;)

Exemplo:
SessionFactory sessionFactory1 = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
SessionFactory sessionFactory2 = new Configuration().configure("/hibernate2.cfg.xml").buildSessionFactory();

Dai o resto é "normal"... openSession(), etc...

Era isso que você queria?

J

O Hibernate Shards está em Beta, ainda
https://www.hibernate.org/22.html#A14

R

Pra te falar a verdade estou bem perdido

Porque utilizo junto com o Spring.Não chamo pelo código o configure da sessionfactory.

<!--
      Hibernate SessionFactory 
   -->
   <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
      
      <property name="dataSource">
         <ref local="dataSource" />
      </property>
      
      <property name="namingStrategy">
          <bean class="org.hibernate.cfg.DefaultComponentSafeNamingStrategy" />
       </property>    
      
      <property name="annotatedClasses">
         <list>
            <!-- Map all files in classpath to the session factory -->
         </list>
      </property>

      <!-- Configuracoes do Hibernate -->
      <property name="hibernateProperties">
         <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
         </props>
      </property>

      <property name="eventListeners">
         <map>
            <entry key="merge">
               <bean
                  class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
            </entry>
         </map>
      </property>
    </bean>

Esse datasource configurado vai ser o principal, todas consultas são feitas nesse.

Se eu configurar uma conexão pelo Java (buildSessionFactory) quando efetuar login.Como o sistema vai saber qual usar?

L

toda informação contida aqui

# <!-- Configuracoes do Hibernate -->
# <property name="hibernateProperties">
# <props>
# <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
# <prop key="hibernate.show_sql">false</prop>
# <prop key="hibernate.format_sql">true</prop>
# <prop key="hibernate.hbm2ddl.auto">update</prop>
# </props>
# </property>

pode ser passada diretamente para a factory... por exemplo, as minhas configurações não são setadas no hibernate.cfg.xml, pois minha senha e login são encriptados...

veja o exemplo abaixo...

public static void main(String[] args) {
		AnnotationConfiguration conf = new AnnotationConfiguration();
		setProperties(conf);
		
		SessionFactory factory = conf.configure().buildSessionFactory();
	}

	private static void setProperties(AnnotationConfiguration conf) {
		HelpDeskConfiguration config = new HelpDeskConfiguration();
		HelpDeskConfigurationFacade facade = new HelpDeskConfigurationFacade(config);
		
		for(Map.Entry&lt;String, String&gt; property : facade.getMainPersistenceUnitProperties().entrySet())
			conf.setProperty(property.getKey(), property.getValue());
	}

A classe HelpDeskConfiguration que le as propriedades em um arquivo meu, chamado helpdesk.properties ... esse arquivo tem meus dados e a factory é criada dinamicamente...

helpdesk.properties
[Persistence]
persistence.unit.main = helpdesk

[Main-Database]
connection.login.encripted = true
connection.driver_class = com.mysql.jdbc.Driver
connection.username = zHjLy%&9=a+v#yY2xSR2NzVkdhMTIz
connection.password = *&qT$%Xhz#$%MmNsCx*6UkdjMw==
connection.url = jdbc:mysql://localhost:3306/helpdesk

[Hibernate]
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.cache.provider_class = org.hibernate.cache.NoCacheProvider
hibernate.show_sql  = true
hibernate.format_sql = true
hibernate.validator.autoregister_listeners = false

o meu hibernate.xml.cfg é assim, puramente em branco

&lt;!DOCTYPE hibernate-configuration PUBLIC  
         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;  
&lt;hibernate-configuration&gt;  
	&lt;session-factory&gt;
	&lt;/session-factory&gt;  
&lt;/hibernate-configuration&gt;
&lt;!--todas informações em helpdesk.properties--&gt;
Criado 16 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 9
Participantes 4