Ajuda com Hibernate!

2 respostas
Leandro-SP

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:

//@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

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.

2 Respostas

marcos1EM

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.

Leandro-SP

Consegui mapear da seguinte forma:

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

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.

Criado 25 de agosto de 2010
Ultima resposta 27 de ago. de 2010
Respostas 2
Participantes 2