[Resolvido] Qual a diferença?

3 respostas
Kleber-rr

Olá pessoal, estou querendo tirar uma dúvida basica.

A questao é a seguinte: como eu não tenho conhecimento em SQL, aprendi nos cursos da caelum a fazer a classe e gerar o banco atravez do hibernate.

QUando eu vou fazer um relacionamento entre tabelas, ficaria mais ou menos assim:

@Entity
@Table(name = "pergunta")
public class Perguntas {

	@Id
	@GeneratedValue
	@Column(name = "cod_perguntas")
	private Long cod_perguntas;
	private Long questionario_cod_questionario;//aqui seria meu relacionamento com a tabela questionario (não me perguntem q tipo de relacionamento é esse...)
	private String descricao;
Só que com o passar do tempo, vi muitos exemplos de outra forma:
@Entity
@Table(name = "pergunta")
public class Perguntas {

	@Id
	@GeneratedValue
	@Column(name = "cod_perguntas")
	private Long cod_perguntas;
	private String descricao;
	private String tipo;

	@OneToMany(mappedBy = "perguntas", fetch = FetchType.LAZY)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	private List<Respostas> respostas = new ArrayList<Respostas>();
	
	@ManyToOne(cascade = javax.persistence.CascadeType.ALL)
	@JoinColumn(name = "questionario")
	private Questionario questionario;

Aí pergunto a vcs: QUal a diferença prática? Qual a melhor forma?? Das duas formas eu sei q funcionam, só q da primeira, quando eu gravo no banco, apenas salvo o id relacional no registro... Já na segunda, salvo o nome (String, seria isso mesmo??).

Aguardo esclarecimento dos colegas.

Abs.

3 Respostas

jfaerman

A segunda forma é melhor porque permite que você trabalhe com o objeto e não simplemente com o código identificador.
Isso permite, além de uma programação mais clara e focada nos objetos, algumas otimizações, como pegar os dois objetos em uma mesma consulta ou carregá-lo apenas quando necessário, de acordo com a sua necessidade.

Abdon

A diferença basica é que, por exemplo, quando vc invocar o metodo getQuestionario em uma entidade gerenciada pelo hibernate, se o relacionamento existir, o objeto já estara populado e carregado para vc, entendeu?

A segunda forma que vc postou é a forma correta de se trabalhar com o hibernate, que faz um mapeamento relacional objeto, logo vc deve trabalhar com os objetos, uma pergunta possui um objeto questionario e não um Long questionario_cod_questionario.

Capitou?

Pergunta p = (Pergunta) session.load(10);
     System.out.println(p.getQuestionario().getDescrição());

Irá funcionar para vc automaticamente!

Kleber-rr

ovelha:
A diferença basica é que, por exemplo, quando vc invocar o metodo getQuestionario em uma entidade gerenciada pelo hibernate, se o relacionamento existir, o objeto já estara populado e carregado para vc, entendeu?

A segunda forma que vc postou é a forma correta de se trabalhar com o hibernate, que faz um mapeamento relacional objeto, logo vc deve trabalhar com os objetos, uma pergunta possui um objeto questionario e não um Long questionario_cod_questionario.

Capitou?

Pergunta p = (Pergunta) session.load(10);
     System.out.println(p.getQuestionario().getDescrição());

Irá funcionar para vc automaticamente!

Valeu pessoal!!

Criado 28 de janeiro de 2010
Ultima resposta 29 de jan. de 2010
Respostas 3
Participantes 3