3 de março de 2011

JPA 2.0: Criando tabelas - Parte 2

Aproveitando o mesmo projeto da postagem da Parte 1: Este aqui vamos montar nossas classes para criar a seguinte estrutura do banco de dados:


Para isso vamos usar as seguintes anotações que tratam as cardinalidades:
@OneToOne
@OneToMany
@ManyToOne
e tem a @ManyToMany que ficará para uma próxima postagem!

No pacote model vamos criar as classes: Endereco.java, Categoria.java, Dependente.java e alterar a Cliente.java.
Começando...
Endereco.java
@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "codigo", nullable = false)
    private Integer codigo;

    @Column(name = "rua")
    private String rua;

    @Column(name = "cidade")
    private String cidade;

    @Column(name = "estado")
    private String estado;

    @OneToOne(mappedBy="endereco", fetch=FetchType.LAZY)
    private Cliente cliente;

    //Getters e Setters
    //equals e hashCode

}

Cliente.java
@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "codigo", nullable = false)
    private Integer codigo;

    @Column(name = "nome")
    private String nome;

    @Column(name = "data_nascimento")
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;

    @Column(name = "limite")
    private Double limite;

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "endereco_codigo", nullable = false)
    private Endereco endereco;

    @OneToMany(mappedBy = "cliente", fetch = FetchType.LAZY)
    private List< Dependente > dependenteList;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "categoria_codigo", nullable = false)
    private Categoria categoria;
   
    //getters e setters
    //equals e hashCode
}
Categoria.java
@Entity
@Table(name = "categoria")
public class Categoria implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "codigo", nullable = false)
    private Integer codigo;

    @Column(name = "nome")
    private String nome;

    @OneToMany(mappedBy = "categoria", fetch = FetchType.LAZY)
    private List< Cliente > clienteList;

    //getters e setters
    //equals e hashCode
}
Dependente.java
@Entity
@Table(name = "dependente")
public class Dependente implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "codigo", nullable = false)
    private Integer codigo;

    @Column(name = "nome")
    private String nome;

    @Column(name = "cpf")
    private String cpf;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cliente_codigo", nullable = false)
    private Cliente cliente;

    //getters e setters
    //equals e hashCode
}

e por fim como ficou nosso persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="TesteJPAPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>5tads</jta-data-source>
    <class>model.Cliente</class>
    <class>model.Endereco</class>
    <class>model.Categoria</class>
    <class>model.Dependente</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

É isso aí! :)

3 comentários:

  1. Oi Andi! Estou tendo problemas na criação dos controladores JPA das classes que possuem anotações @onetomany e @manytomany. No caso estou fazendo um cadastro de alunos e telefones. O aluno pode ter vários telefones. Pelo Netbeans gero minhas entidades e o controlador JPA para fazer a inserção no banco porém não obtenho sucesso. Você poderia me dar uma mãozinha? Desde já agradeço! Abraços!

    ResponderExcluir
  2. Olá Vanessa! Teria como vc dizer exatamente qual o problema que está ocorrendo? Ele dá algum erro?

    ResponderExcluir
  3. OLa estou tendo o problema com ManytoOne, não estou conseguindo inserir em uma tabela, da o seguinte erro: Collum 'cod_UF' cannot be null

    Na tabela UF usei a anotação: @OneToMany(mappedBy="uf")
    private Collection cidades;

    Na tabela Cidade usei: @ManuyToOne
    @JoinCollum (name=cod_UF")
    private UF uf;

    ResponderExcluir

Deixe seu comentário... ;)