Ajuda com Hibernate!

Olá pessoal boa noite tudo bom?
Estou com dificuldades em mapear duas classes usando o Hibernate. Não sei qual a melhor forma de mapear o sistema.
A principio o sistema terá um cadastro de usuarios com os seguintes campos:

[list]Nome[/list]
[list]Endereço[/list]
[list]Telefone (residencial e celular)[/list]
[list]CPF[/list]
[list]Data Nascimento[/list]

Que serão mapeados na classe Usuario. Estes campos ficarão num formulario. Ao clicar no botão “proximo”, aparecerá um outro formulario com alguns inputs/selects/combobox:

[list]Raça (fazer a escolha num option)[/list]
[list]Fumante (sim ou não)[/list]
[list]Possui doença crônica (sim ou nao, e no caso de sim, aparecerá um inputtext para escrever qual a doença)[/list]
[list]etc…[/list]

Que serão mapeados na classe Questionario.

A pergunta é, qual a melhor forma de mapear estes sistema usando o Hibernate? Eu tenho que criar uma associação @OneToMany ou @ManyToMany?
Como que eu mapearei nas respectivas classes, cada campo do formulario?

Alguém tem uma idéia para me ajudar?

Tentei fazer o seguinte, será o correto? Como eu vou popular os campos da classe Questionario?

@Entity
public class Usuario {
	
	@Id
	@GeneratedValue
	private Long id;
	
	@NotNull
    private String nome;
	
	@NotNull
	private String sexo;
	
	@NotNull
	@Temporal(TemporalType.DATE)
	private Date datanasc;
	
	@NotNull
	private String cep;
	
	@NotNull
	private String logradouro;
	
	@NotNull
	private String bairro;
	
	@NotNull
	private String cidade;
	
	@NotNull
	private String estado;
	
	@NotNull
	private String numero;
	
	@NotNull
	private String complemento;
	
	@NotNull
	private String cpf;
	
	@NotNull
	@CollectionOfElements  
	private List <String>tel;
	
	@NotNull
	private String email;
	
	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)  
    @PrimaryKeyJoinColumn
    @NotNull
    private Questionario questionario;

//gets e sets

}

E classe Questionario:

[code]//@Entity
public class Questionario {

@Id
@GeneratedValue
private Long id;
@NotNull
private String pergunta;
@NotNull
private String resposta;
@NotNull
private String detalhe;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)  
@PrimaryKeyJoinColumn
@NotNull

private Usuario usuario;

//gets e sets

[/code]

Qual a melhor forma de mapear os campos, para eu poder buscar um usuario pelo ID por exemplo e o Hibernat e já carregar todas perguntas e respostas do questionario automaticamente? E a questao do campo Telefone? Como poderei inserir o usuario com 2 telefone por exemplo?

Ficarei feliz se alguém puder me ajudar.
Aguardo resposta.
Obrigado.
Att,
Leandro.

Isso depende da cardinalidade entre as entidades, mas se vc quer carregar trazer todos os questionarios ao carregar o usuário, vc pode criar uma lista de questionarios no usuário, ex:


// no Questionario 
@ManyToOne(cascade=javax.persistence.CascadeType.ALL)
  @JoinColumn(name="id")// id do usuario
  private Usuario codUsuario;

// no Usuario
 @OneToMany(mappedBy="codUsuario", fetch=FetchType.EAGER, cascade=javax.persistence.CascadeType.ALL)
  private List<Questionario> questionarios;

Dessa forma ao buscar o usuário ira vir todos os Questionários que ele possue

tratando-se do problema em inserir dois telefenes (residencial ou celular) eu criaria um campo para cada um.

Consegui mapear da seguinte forma:

//na classe Usuario @OneToMany(mappedBy="codUsuario", fetch=FetchType.EAGER, cascade=CascadeType.ALL) private List<Questionario> questionarios;

[code]//na classe Questionario
@EmbeddedId
@GeneratedValue
private Long id;

@NotNull
private String pergunta;

@NotNull
private String resposta;

@NotNull
private String detalhe;

@ManyToOne(cascade=CascadeType.ALL)  
@JoinColumn(name="id")
private Usuario codUsuario;  

[/code]

Está correto assim? Principalmente a parte do EmbeddedId na classe de Questionario.

A tabela de Usuario ficou assim:

mysql> describe usuario;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| bairro         | varchar(255) | YES  |     | NULL    |                |
| celular        | varchar(255) | YES  |     | NULL    |                |
| cep            | varchar(255) | YES  |     | NULL    |                |
| cidade         | varchar(255) | YES  |     | NULL    |                |
| complemento    | varchar(255) | YES  |     | NULL    |                |
| cpf            | varchar(255) | YES  |     | NULL    |                |
| datanasc       | date         | YES  |     | NULL    |                |
| email          | varchar(255) | YES  |     | NULL    |                |
| estado         | varchar(255) | YES  |     | NULL    |                |
| logradouro     | varchar(255) | YES  |     | NULL    |                |
| nome           | varchar(255) | YES  |     | NULL    |                |
| numero         | varchar(255) | YES  |     | NULL    |                |
| sexo           | varchar(255) | YES  |     | NULL    |                |
| telResidencial | varchar(255) | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+

e a tabela do questionario ficou assim:

mysql> describe questionario; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | value | bigint(20) | NO | PRI | NULL | | | detalhe | varchar(255) | YES | | NULL | | | pergunta | varchar(255) | YES | | NULL | | | resposta | varchar(255) | YES | | NULL | | | id | bigint(20) | YES | MUL | NULL | | +----------+--------------+------+-----+---------+-------+

Agora e para testar isso dai? Qual a melhor forma?

Ja tenho o Controller para o Usuario e o meu form está gravando ok na tabela de usuario, mas como faço para gravar e listar informações na tabela de Questionario?

Aguardo resposta.
Obrigado.
Att,
Leandro.