Spring, JPA e vários schemas

10 respostas
J

Pessoal,

Tenho um sistema com Spring, JPA, etc …

Surgiu a necessidade de utilizar vários schemas de banco, de acordo com o usuário que irá logar deverá ser acessado um schema de banco diferente.

Alguém sabe como posso fazer?

Atualmente tenho meu pesistence.xml e configuro o EntityManager e DataSource no Spring assim:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="pu" />
    <property name="dataSource" ref="pooledDS"></property>
    <property name="jpaDialect">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
  </bean>
<bean id="defDataSourceTarget" destroy-method="close"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
	<property name="url" value="jdbc:postgresql://localhost:5432/bd" />
    <property name="username" value="user" />
    <property name="password" value="pass" />
  </bean>

Obrigado!

10 Respostas

O

Boa tarde.

Na annotation @Table tem uma propriedade chamada schema.

J

Olá Caio…

Na verdade, é isso que estou fazendo atualmente.
O problema é que a partir de agora, vou precisar alternar entre duas schemas de forma dinâmica.

Usuário 1 = Schema 1 e Usuário 2 = Schema 2 (por exemplo).

Só vou saber qual usuário(e qual schema usar) no momento do login!

Obrigado!

O

Agora deu uma embananada.

Você esta dizendo que algumas tabelas vão ficar em um schema e algumas em outro schema.

shema-> dados1 -> tabela-> tabela1
shema-> dados1 -> tabela-> tabela2

shema-> dados2 -> tabela-> tabela3
shema-> dados2 -> tabela-> tabela4

E que cada schema tem um usuário e senha diferente?

Se sim nunca vi nada para fazer uma configuração assim, a senha que você tem é para o banco.

Esse usuário deveria te dar acesso aos dois esquemas.

Att,

J

hehe… deixa eu explicar melhor.

Quem vai acessar o sistema são duas empresas.
Cada empresa vai ter um schema diferente no banco, com a mesma estrutura de tabelas.

Vou saber qual schema acessar de acordo com qual empresa o usuário selecionar no momento do login.

Melhorou? :?

Obrigado!

B

Joaozava:
hehe… deixa eu explicar melhor.

Quem vai acessar o sistema são duas empresas.
Cada empresa vai ter um schema diferente no banco, com a mesma estrutura de tabelas.

Vou saber qual schema acessar de acordo com qual empresa o usuário selecionar no momento do login.

Melhorou? :?

Obrigado!

Eu tive essa mesma dificuldade, e acabei escrevendo um componente java, para fazer isso de forma bem simples.

da uma olhada :

http://code.google.com/p/jpa-component/wiki/Doc_PT_Br?ts=[telefone removido]&updated=Doc_PT_Br

J

bobboyms:
Joaozava:
hehe… deixa eu explicar melhor.

Quem vai acessar o sistema são duas empresas.
Cada empresa vai ter um schema diferente no banco, com a mesma estrutura de tabelas.

Vou saber qual schema acessar de acordo com qual empresa o usuário selecionar no momento do login.

Melhorou? :?

Obrigado!

Eu tive essa mesma dificuldade, e acabei escrevendo um componente java, para fazer isso de forma bem simples.

da uma olhada :

http://code.google.com/p/jpa-component/wiki/Doc_PT_Br?ts=[telefone removido]&updated=Doc_PT_Br

Olá, obrigado pela dica!

Mas tenho duas dúvidas.

  1. Como ficaria a integração do seu componente com Spring?
  2. Como alterar o Schema utilizado de forma dinâmica, ex.: http://meusite.com?schema=1 ou http://meusite.com?schema=2

Obrigado!

B

Joaozava:
bobboyms:
Joaozava:
hehe… deixa eu explicar melhor.

Quem vai acessar o sistema são duas empresas.
Cada empresa vai ter um schema diferente no banco, com a mesma estrutura de tabelas.

Vou saber qual schema acessar de acordo com qual empresa o usuário selecionar no momento do login.

Melhorou? :?

Obrigado!

Eu tive essa mesma dificuldade, e acabei escrevendo um componente java, para fazer isso de forma bem simples.

da uma olhada :

http://code.google.com/p/jpa-component/wiki/Doc_PT_Br?ts=[telefone removido]&updated=Doc_PT_Br

Olá, obrigado pela dica!

Mas tenho duas dúvidas.

  1. Como ficaria a integração do seu componente com Spring?
  2. Como alterar o Schema utilizado de forma dinâmica, ex.: http://meusite.com?schema=1 ou http://meusite.com?schema=2

Obrigado!

Bom dia! Sobre integração com o sping não tenho ideia, porque numca trabalhei com ele!

agora o schma de forma dinamica você vai ter que pegar a url do usuário e tratar ela.
segue o link http://www.exampledepot.com/egs/javax.servlet/GetReqUrl.html

depois que voce obter o schema através da url você faz assim

Configuration configuration = ConfigPersistence.getInstanceConfiguration();
                
                // adicionar o novo do schema no construtor
                EntityManagerFactory factory = configuration.createEntityManagerFactory("schema_test");
                
                EntityManager em = factory.createEntityManager();
T

Joaozava:
Pessoal,

Tenho um sistema com Spring, JPA, etc …

Surgiu a necessidade de utilizar vários schemas de banco, de acordo com o usuário que irá logar deverá ser acessado um schema de banco diferente.

Alguém sabe como posso fazer?

Atualmente tenho meu pesistence.xml e configuro o EntityManager e DataSource no Spring assim:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="pu" />
    <property name="dataSource" ref="pooledDS"></property>
    <property name="jpaDialect">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
  </bean>
<bean id="defDataSourceTarget" destroy-method="close"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
	<property name="url" value="jdbc:postgresql://localhost:5432/bd" />
    <property name="username" value="user" />
    <property name="password" value="pass" />
  </bean>

Obrigado!

Recuperando o tópico…

Joaozava, vc conseguiu resolver esse tópico? Me deparei com a mesma situação.
Estou usando Spring Data + JPA.

J

tiago.javaman,

não consegui, acabei não precisando mais dessa solução.

mas caso descubra uma solução seria de grande ajuda se compartilhar :slight_smile:

T

Pois é, vamos a luta.

Achei alguma coisa na net, mas usando spring security, e não estou usando esse módulo do spring. :frowning:

Criado 4 de julho de 2011
Ultima resposta 16 de jul. de 2013
Respostas 10
Participantes 4