Universidade Federal de Pernambuco
Centro de Informática - Sistemas de Informação
IF992 - Programação 2 :: Lista de Exercícios 13
Prof. Vinicius Cardoso Garcia
Exercício 1 – Mapeamento Um para Um
1. Crie a classe Usuário
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @Entity @Table(name = "tb_usuario")
@SequenceGenerator(name = "sq_usuario", sequenceName = "sq_usuario")
public class Usuario { @Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_usuario") @Column(name = "id_usuario")
private Long id;
@Column(name = "login", length = 20, nullable = true)
private String login;
@Column(name = "senha", length = 10, nullable = true)
private String senha;
@OneToOne(mappedBy = "usuario")
private Pessoa pessoa;
public Long getId() {
return id; }
public void setId(Long id) {
this.id = id; }
public String getLogin() {
return login; }
public void setLogin(String login) {
this.login = login; }
public String getSenha() {
return senha; }
public void setSenha(String senha) {
this.senha = senha; }
public Pessoa getPessoa() {
return pessoa; }
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa; }
}
2. Crie na classe Pessoa.
import java.util.Date; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @Table(name = "tb_pessoa")
@SequenceGenerator(name = "sq_pessoa", sequenceName = "sq_pessoa")
public class Pessoa { @Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_pessoa") @Column(name = "id_pessoa")
private Long id;
@Column(name = "nome", length = 30, nullable = true)
private String nome;
@Column(name = "ativo", nullable = true)
protected Boolean ativo; @Temporal(TemporalType.DATE)
@Column(name = "dt_criacao", nullable = true)
private Date nascimento;
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
private Usuario usuario;
public Long getId() {
return id; }
public void setId(Long id) {
public Date getNascimento() {
return nascimento; }
public void setNascimento(Date nascimento) {
this.nascimento = nascimento; }
public Boolean getAtivo() {
return ativo; }
public void setAtivo(Boolean ativo) {
this.ativo = ativo; }
public Usuario getUsuario() {
return usuario; }
public void setUsuario(Usuario usuario) {
this.usuario = usuario; }
}
3. Inclua no DAO um metodo para incluir a pessoa com seu respectivo usuario:
public void inserirUsuario(Pessoa pessoa, Usuario usuario) { Session sessao = HibernateUtil.getSession();
Transaction transaction = sessao.beginTransaction(); sessao.save(pessoa); usuario.setPessoa(pessoa); sessao.save(usuario); pessoa.setUsuario(usuario); sessao.update(usuario); transaction.commit(); sessao.close(); }
4. Construa um teste na classe AlunoDAOTest que verifique essa inclusao:
@Testpublic void testInclusaoUsuario(){ Pessoa pessoa = new Pessoa(); pessoa.setNome("Joao");
pessoa.setNascimento(new Date()); Usuario usuario = new Usuario(); usuario.setLogin("joao");
usuario.setSenha("123");
pessoaDAO.inserirUsuario(pessoa, usuario); Usuario usuarioB = pessoaDAO.getUsuario(pessoa);
assertEquals(pessoa.getId(), usuarioB.getPessoa().getId());
}
5. Crie a classe Endereco
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @Entity @Table(name = "tb_endereco")@SequenceGenerator(name = "sq_endereco", sequenceName = "sq_endereco")
public class Endereco { @Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_endereco") @Column(name = "id_endereco")
private Long id;
@Column(name = "logradouro", length = 45)
public String logradouro; @ManyToOne
@JoinColumn(name = "fk_pessoa")
private Pessoa pessoa;
public Long getId() {
return id; }
public void setId(Long id) {
this.id = id; }
public String getLogradouro() {
return logradouro; }
public void setLogradouro(String logradouro) {
this.logradouro = logradouro; }
public Pessoa getPessoa() {
return pessoa; }
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa; }
}
2. Inclua na classe Pessoa coleção de endereço e seu respectivos get e set. Inicialize a
coleção no método construtor da classe.
enderecos = new ArrayList<Endereco>(); }
●
Na classe Pessoa crie o get e set de enderecos;
public List<Endereco> getEnderecos() {
return enderecos; }
public void setEnderecos(List<Endereco> endereco) {
this.enderecos = endereco; }
3. Inclua a classe Endereco no hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory> <property
name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property> <property
name="hibernate.connection.url">jdbc:hsqldb:hsql://localhost/escola</property> <property name="hibernate.connection.username">sa</property>
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property> <property name="show_sql">true</property>
<property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping class="Pessoa" />
<mapping class="Usuario" /> <mapping class="Endereco" /> </session-factory>
</hibernate-configuration>
Exercício 3 – Execução e Testes
1. Crie na classe de teste PessoaDaoTest um teste para verificar a inclusao de endereço.
@Testpublic void testInclusaoEndereco(){ Pessoa pessoa = new Pessoa(); pessoa.setNome("Joao");
pessoa.setNascimento(new Date()); Endereco endereco = new Endereco(); endereco.setLogradouro("Rua sem nome"); pessoaDAO.inserirEndereco(pessoa, endereco);
Pessoa pessoaB = pessoaDAO.getPessoa(pessoa.getId());
assertEquals(1, pessoaB.getEnderecos().size());
assertEquals("Rua sem nome",pessoaB.getEnderecos().get(0).getLogradouro());
}
Exercício 4 – Mapeamento muitos para muitos
6. Cria a classe Produto
import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @Entity @Table(name = "tb_produto")
@SequenceGenerator(name = "sq_produto", sequenceName = "sq_produto")
public class Produto { @Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq_produto") @Column(name = "id_produto")
private Long id;
@Column(name = "nome", length = 30, nullable = true)
private String nome;
@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
private List<Pessoa> pessoas;
this.id = id; }
public String getNome() {
return nome; }
public void setNome(String nome) {
this.nome = nome; }
public List<Pessoa> getPessoas() {
return pessoas; }
public void setPessoas(List<Pessoa> pessoas) {
this.pessoas = pessoas; }
}
7. Adicione a classe pessoa a coleção de produtos, inicialize-a no construtor da classe:
@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })private List<Produto> produtos;
public Pessoa(){
enderecos = new ArrayList<Endereco>(); produtos = new ArrayList<Produto>(); }
8. Crie um metodo para inclusao de produtos na classe PessoaDAO
public void inserirProduto(Pessoa pessoa, Produto produto) { Session sessao = HibernateUtil.getSession();
Transaction transaction = sessao.beginTransaction(); pessoa.getProdutos().add(produto); produto.getPessoas().add(pessoa); sessao.saveOrUpdate(pessoa); sessao.saveOrUpdate(produto); transaction.commit(); sessao.close(); }
9. Inclua a classe no hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="hibernate.connection.url">jdbc:hsqldb:hsql://localhost/escola</property> <property name="hibernate.connection.username">sa</property>
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property> <property name="show_sql">true</property>
<property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping class="Pessoa" />
<mapping class="Usuario" /> <mapping class="Endereco" /> <mapping class="Produto" /> </session-factory>
</hibernate-configuration>
10. Crie o o teste para verificar a inclusao na classe PessoaDAOTest
public void testInclusaoProduto(){ Pessoa pessoa = new Pessoa(); pessoa.setNome("Joao");
pessoa.setNascimento(new Date()); Produto produto = new Produto(); produto.setNome("Coca-Cola");
pessoaDAO.inserirProduto(pessoa, produto);
Pessoa pessoaB = pessoaDAO.getPessoa(pessoa.getId());
assertEquals(1, pessoaB.getProdutos().size());
assertEquals("Coca-Cola", pessoaB.getProdutos().get(0).getNome());
}