Olá.
para cada tabela do banco eu terei um javabean e um dao?
Não necessariamente. Geralmente se constrói uma classe DAO para uma Entidade de nível mais acima. Por exemplo, no caso mestre/detalhe, existe uma classe Cliente e uma Endereco, e Cliente tem uma referência a Endereco:
class Cliente {
private Endereco endereco;
// getter e setter (se necessário)
}
Vamos dizer que pelo entendimento do negócio, Endereco não faça sentido sem Cliente. Endereco é um complemento de Cliente. Não faz muito sentido criar um DAO só para Endereco. Quando você fizer uma consulta de Cliente no ClienteDAO, deve retornar um objeto Cliente já com o Endereco preenchido.
em casos de relacionamentos(FKs) o correto seria a classe ter o objeto ou apenas um campo Long para o id da fk?
Não. No mundo OO, FKs não fazem sentido. FKs só fazem sentido em bancos relacionais. De qualquer forma você tem que mapear de alguma forma para que vença essas diferenças.
No caso Cliente e Endereço ficaria como o exemplo acima. Quando se fizer a consulta no banco, no ClienteDAO, se trará também as informações do Endereco, se construirá o objeto Endereco e passará para objeto Cliente:
class ClienteDAO {
public Cliente buscarClientePorNome(String nome) {
//Código para consultar o banco trazendo as informações de Cliente e Endereco
Cliente cliente = //Construção do objeto Cliente passando algo para o construtor ou não
Endereco endereco = //Construção do objeto Endereco passando algo para o construtor ou não
//preenchimento do objeto Endereco
cliente.setEndereco(endereco);
//preenchimento do restante do objeto Cliente.
return cliente;
}
}
É isso.
Victor Benjamin