Aplicação com vários usuários

15 respostas
M

Boa Noite Galera!!!

Seguinte, gostaria de saber se é possível criar uma aplicação Flex 4 que acesse determinado Banco de Dados de acordo com o usuário logado…

Isso é possível???

Desde já muito obrigado.

15 Respostas

F

Depende, caso voce crie uma tabela de usuarios unificada para todos os bancos e no backend julgar qual tabela determinado usuario deve acessar é possível sim. Lembrando que o flex não acessa banco de dados, voce teria que usar um backend em java ou em php por exemplo.

M

Fabricio,

Eu já até tenho a aplicação funcionado com dois bancos, porém ainda não critico os clientes, estou usando o Flex 4 com back-end Java + Hibernate e Banco de Dados Firebird.

O que estou precisando é que na tela principal, terá um combo para Cliente e um combo para Anos, após a seleção (Exemplo: Cliente 01 - Ano: 2009) farei uma validação de Nome e Usuário já no Banco deste Cliente.

A regra de negócio não é minha, foi me solicitado isso, o cliente vai ter um Banco de Dados por ano.

Resumindo: Como faço para setar o Banco de Dados a partir da seleção do Cliente e do Ano na tela principal???

chamuska

MaktubBruno:
Fabricio,

Eu já até tenho a aplicação funcionado com dois bancos, porém ainda não critico os clientes, estou usando o Flex 4 com back-end Java + Hibernate e Banco de Dados Firebird.

O que estou precisando é que na tela principal, terá um combo para Cliente e um combo para Anos, após a seleção (Exemplo: Cliente 01 - Ano: 2009) farei uma validação de Nome e Usuário já no Banco deste Cliente.

A regra de negócio não é minha, foi me solicitado isso, o cliente vai ter um Banco de Dados por ano.

Resumindo: Como faço para setar o Banco de Dados a partir da seleção do Cliente e do Ano na tela principal???

Se eu entendi direito e algo tipo:
Combo nome, o usuario escolhe o nome, depois de escolher o nome a combo ano é preenchida com os anos referentes ao usuario ?!

Se for isso a logica é facil!
Não lembro bem dos comandos em flex/AS pois sou iniciante, mas acho que da para fazer assim:

  • Apos selecionado o nome na combo, é chamada uma função passando o id do nome escolhido.
    – Na função é feita a programação onde passa o id para o codigo Java que faz a busca pelos anos referentes ao id do nome.
    – Java retorna um array com os anos.
    – Com o array recebido voce faz algum tipo de laço de repetição para pegar os anos retornados e inserir na combo Ano.
  • A combo Ano ja tem os anos referentes ao nome escolhido, basta selecionar o ano.
  • Proximo passo é pegar o nome e o ano (ou o ID deles) selecionados para fazer o que voce precisa.

Eu ja fiz esse tipo de coisa no php usando JavaScript e Ajax e creio que fazer isso no Flex seja ainda mais facil!

Espero ter ajudado!

F

Quando voce criar o client flex passe como parametro para o java e para o hibernate o bd que voce vai usar e crie a conexao baseado nesse parametro. Dai voce pode validar oque quiser. :slight_smile: Espero ter ajudado. Lembrando que a conexão com o banco pode ser instanciada manualmente no hibernate, não só pelo hibernate.cfg.xml.

F

Outra coisa, a regra de negócio é do cliente mas a arquitetura da aplicação é responsabilidade do desenvolvedor. Então, contanto que sirva as necessidades do cliente a arquitetura pode ser feita de mil maneiras diferentes.

M

Fabrício, entendi… O que acontece é que estou apanhando para montar a estrutura dessa regra.

Seguinte, acredito não ser problema criar a tela inicial onde terá os combos com os Nomes e Anos (Ano de acordo com o cliente).
Meu problema é para setar o Banco de acordo com estas informações entende.

Tipo, eu criei uma Classe HibernateUtil

package hibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtilAnual {

	private static SessionFactory sessionFactoryAnual;
	private static Session sessionAnual;
	// private static Logger logger = Logger.getLogger(hibernateUtil.class);

	static {
		try
        {
			sessionFactoryAnual = new Configuration().configure("hibernateAnual.cfg.xml").buildSessionFactory();
        }
		catch(Exception erro)
        {
        	sessionFactoryAnual = null;
        }		
	}

	public static Session getCurrentSession() {
		if (sessionAnual == null || !sessionAnual.isOpen() || !sessionAnual.isConnected()) {
			sessionAnual = ((SessionFactory) sessionFactoryAnual).openSession();
		}

		return sessionAnual;
	}

	public static void closeSession() {
		sessionAnual.close();
	}

}

Sei que para cada Banco é só criar um “.cfg.xml”, só que não sei como fazer para passar um parâmetro para esta classe, tipo passar a descrição do “.cfg.xml” a se conectar.

Estou apanhando nesta parte, eu já programo, mais estou iniciando tanto em Java quanto Flex.

F

Uma sugestão, crie uma tabela mestre para armazenar quais os clientes e os bancos cadastrados para poder retornar no cliente flex, ja que senao a cada criacao de um banco de dados novo voce tera que recompilar o programa e ao invés de utilizar o xml para configurar o hibernate faça com código a conexao, os mapeamentos pode deixar no xml mesmo. Qualquer coisa meu skype é fa.batista. Se quiser tirar alguma duvida é só me adicionar e chamar por la.

F
private static SessionFactory sessionFactoryAnual;  
private static Session sessionAnual;

sessionAnual=sesessionFactoryAnual.open(Connection c,Interceptor i)
Entao na connection c voce pode por os parametros de conexao com determinado banco de dados
M
Fabricio Batista:
private static SessionFactory sessionFactoryAnual;  
private static Session sessionAnual;

sessionAnual=sesessionFactoryAnual.open(Connection c,Interceptor i)
Entao na connection c voce pode por os parametros de conexao com determinado banco de dados

Fabrício, Boa Tarde!!!

Andei fuçando aqui e consegui fazer a conexão via código:
package hibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	
	private static SessionFactory sessionFactoryGeral;
	private static Session sessionAnual;
	private static String caminhoBanco = "bancos/GERAL.FDB";
		
	static {
		try
        {
			
			Configuration configuration = new Configuration()
			.addResource("br/com/ehweb/business/repositorys/maps/geral/Ano.hbm.xml")				   
			.addResource("br/com/ehweb/business/repositorys/maps/geral/Estabelecimento.hbm.xml")	
			.setProperty("hibernate.dialect", "org.hibernate.dialect.FirebirdDialect")
			.setProperty("hibernate.connection.driver_class", "org.firebirdsql.jdbc.FBDriver")
			.setProperty("hibernate.connection.url", "jdbc:firebirdsql:localhost/3050:.../"+caminhoBanco)
			.setProperty("hibernate.connection.username", "SYSDBA")
			.setProperty("hibernate.connection.password", "masterkey");
		
			sessionFactoryGeral = configuration.buildSessionFactory();
        }
		catch(Exception erro)
        {
        	sessionFactoryGeral = null;
        }
	}
	
	public static Session getCurrentSession() {		
		if (sessionAnual == null || !sessionAnual.isOpen() || !sessionAnual.isConnected()) {
			sessionAnual = ((SessionFactory) sessionFactoryGeral).openSession();
		}

		return sessionAnual;
	}

	public static void closeSession() {
		sessionAnual.close();
	}
}

Consegui também montar os combos para retornar os Anos de acordo com Instituição selecionada, com isso consigo montar uma String com o caminho para o Banco que deverá se conectar.
Meu problema agora é passar essa String para o HibernateUtil que criei, onde a Variável caminhoBanco representa o caminho do Banco a ser conectado.

Desculpe galera, tentei de várias formas e não consegui, o problema não é passar o parâmentro para o Java, mais sim como montar o HibernateUtil de forma que receba este parâmetro, alimente a Variável caminhoBanco.

Desde já muito obrigado pela atenção

F

Crie um metodo em java de forma que ele seja chamado no flex e a partir dos dados do combobox. Ao invés de utilizar um construtor quebre o hibernate utils em metodos.

M

Cara, Juro que tentei fazer isso… Tentei passar os dados para um construtor do HibernateUtil, porém apresenta alguns problemas, mais com certeza é na linguagem, ou seja, eu não consegui.

As variáveis tem de ser static? Se eu mudo a linguagem exige automaticamente.

Eu estou fazendo exatamente dessa forma, a partir de DAO eu chamo o HibernateUtil, queria passar para o Construtor o parametro para alimentar justamente a variavel caminhoBanco.

F

No construtor não, teria que ser em um metodo remoto. um metodo simples.

M

Ok, vou tentar modificar aki…

Desde já valeu d+.

M

MaktubBruno:
Ok, vou tentar modificar aki…

Desde já valeu d+.

Cara, o meu problema é na hora de passar o paramento para o HibernateUtil.

Veja só o que eu fiz no HibernateUtil:

private static SessionFactory sessionFactory;
	private static Session session;

	private static void buildSessionFactory(String caminhoBanco) throws Exception {
		
		if (sessionFactory == null) {
			try {

				Configuration cfg = new Configuration()
						.addResource(
								"br/com/ehweb/business/repositorys/maps/anual/Teste.hbm.xml")
						.setProperty("hibernate.dialect",
								"org.hibernate.dialect.FirebirdDialect")
						.setProperty("hibernate.connection.driver_class",
								"org.firebirdsql.jdbc.FBDriver")
						.setProperty(
								"hibernate.connection.url",
								"jdbc:firebirdsql:localhost/3050:"+caminhoBanco)
						.setProperty("hibernate.connection.username", "SYSDBA")
						.setProperty("hibernate.connection.password",
								"masterkey");

				sessionFactory = cfg.buildSessionFactory();

			} catch (Exception e) {
				sessionFactory = null;
				throw e;
			}
		}
	}

	public static Session getCurrentSession(String caminhoBanco) {
		
		try {

			if (session == null || !session.isOpen()) {
				
				if (sessionFactory == null) {
					buildSessionFactory(caminhoBanco);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return session;
	}

Agora no DAO, veja só:

public class TesteDAO implements ITeste {
	private Session sessaoAnual = HibernateUtilAnual.getCurrentSession("Bd03/TESTE.FDB");

	@SuppressWarnings("unchecked")
	@Override
	public List<Teste> getList() throws Exception {
		List<Teste> list = sessaoAnual.createQuery(
				"FROM Teste").list();
		HibernateUtilAnual.closeSession();
		return list;
	}

}

Como vou fazer para enviar os dados do Flex para o DAO e pegar este valor e passar para getCurrentSession

Você não teria um exemplo de como eu poderia fazer isso???
Ficarei eternamente grato.

F

É só chamar o RemoteObject pelo flex passando o parametro desejado, não entendi sua duvida.

Criado 14 de fevereiro de 2011
Ultima resposta 28 de fev. de 2011
Respostas 15
Participantes 3