Salvar mais de uma entidade

7 respostas
N

Estou personalizando o exemplo da apostila fj28 da caelum. No meu caso, estou tendo a necessidade de salvar mais de uma entidade no banco de dados, a partir de dados de um único formulário. Essas entidades estão relacionadas.

Parte do código formulario:
<tr>
                                <td><label for="nome">Nome do Cliente:</label></td>
                                <td><input id="nome" type="text" name="cliente.nome"size="60" maxlength="60"></input></td>	
                     </tr>

                     <tr>
                                <td><label for="logradouro">logradouro:</label></td>
                                <td><input id="logradouro" name="endereco.logradouro" type="text" size="60" maxlength="60"></td>
                     </tr>

                     <tr>
                                <td><label for="ddd">DDD:</label><input id="ddd" name="telefone.ddd" type="text" size=3" maxlength="3"></input> </td> 
                                <td> <label for="numeroTelefone">Numero:</label> <input id="numeroTelefone" type="text"  name="telefone.numeroTelefone" size=8" maxlength="8"> </input></td>
                     </tr>
O método que recebe no Controller:
public void adiciona(Cliente cliente, Endereco endereco, Telefone telefone){
		dao.salva(cliente, endereco, telefone);
		result.redirectTo(ClienteController.class).lista();

	}
O método que salva no Dao:
public void salva(Cliente cliente, Endereco endereco,
			Telefone telefone) {
		Transaction tx = session.beginTransaction();
		session.save(cliente);
		session.save(endereco);
		session.save(telefone);
		cliente.setEndereco(endereco);
		session.update(cliente);
		telefone.setCliente(cliente);
		session.update(endereco);
		tx.commit();
	}

Da forma com eu estou fazendo, dá certo, ele cadastra no banco as três entidades e seta os valores das fks, porém, gostaria de saber de existe alguma melhor prática para se fazer isso que eu fiz ou é desta forma mesmo.

Agradeço quaisquer esclarecimentos.

7 Respostas

surfzera

acho que da forma que você está fazendo está correto.

renanreismartins

dependendo do seu modelo, telefone e endereço podem ser atributos de um cliente, assim quando vc salva um cliente, ja salva automaticamente esses atributos

abrasss

Lucas_Cavalcanti

vc pode dar os nomes dos parâmetros no form:

cliente.nome = "joao"
cliente.endereco.logradouro = "rua das mercedes"
cliente.telefone.numeroTelefone = 2345678

e receber só cliente na lógica…
(cliente precisa ter um get/setEndereco e um get/setTelefone)

endereco e telefone não precisam necessariamente ser Entidades, vc pode deixá-los como @Embedded, assim vc só precisa salvar o cliente.

N

renanreismartins:
dependendo do seu modelo, telefone e endereço podem ser atributos de um cliente, assim quando vc salva um cliente, ja salva automaticamente esses atributos

abrasss

No meu modelo, telefone e endereço são referentes a um cliente, mas estão em tabelas diferentes, por serem usadas por outras tabelas ( tbm podem ser de um funcionario, etc).

Abraço!

N

Lucas Cavalcanti:
vc pode dar os nomes dos parâmetros no form:

cliente.nome = "joao"
cliente.endereco.logradouro = "rua das mercedes"
cliente.telefone.numeroTelefone = 2345678

e receber só cliente na lógica…
(cliente precisa ter um get/setEndereco e um get/setTelefone)

Obrigadss! já usei sua dica.
:slight_smile:

Lucas_Cavalcanti

vc pode dar @Embedded em mais de uma entidade…

cuidado pra não ficar fazendo tabelas/entidades demais.

Ex:

@Embeddable
public class Endereco {
   //...
}
@Entity
public class Cliente {
    //sem anotacoes
    private Endereco endereco;
}
@Entity
public class Funcionario {
    //sem anotacoes
    private Endereco endereco;
}

assim o hibernate só vai criar as tabelas Cliente e Funcionario, não vai criar a tabela Endereco. Todos os campos de Endereco vão estar nas tabelas Cliente e Funcionario…

ou vc pode usar cascade

N

Lucas Cavalcanti:

assim o hibernate só vai criar as tabelas Cliente e Funcionario, não vai criar a tabela Endereco. Todos os campos de Endereco vão estar nas tabelas Cliente e Funcionario…

ou vc pode usar cascade

Sabe Lucas, é que na minha aplicação, o BD está pronto e devo manter esta tabela Endereco.

Por isso, ao enviar no formulario, estou mantendo a forma da sua dica inicial:

cliente.nome = "joao"  
cliente.endereco.logradouro = "rua das mercedes"  
cliente.telefone.numeroTelefone = 2345678

E na classe Cliente:

@OneToOne
	@JoinColumn(name="cd_endereco")
	private Endereco endereco;

//get e set
Criado 1 de dezembro de 2010
Ultima resposta 1 de dez. de 2010
Respostas 7
Participantes 4