[Resolvido] Qual a diferença?

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:

[code]@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;

[/code]

Só que com o passar do tempo, vi muitos exemplos de outra forma:

[code]@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;

[/code]

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.

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.

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!

[quote=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![/quote]

Valeu pessoal!!