Dúvidas com JPA com MySql

4 respostas
C

Olá pessoal, tenho a seguinte situação: PRODUTOS * ---- 0…1 PROMOÇÕES.

como ficariamminhas tabelas? no mysql quando coloco uma fk (ID_PROMOCOES) do tipo int em produtos, o mesmo não aceita null, mais o produto pode ou não ter uma promoção, assim sendo as vezes esta fk em produtos irá ficar vazia, só que o bd não aceita por o campo ser int, o que fazer???

4 Respostas

hodrigohamalho

você tem que ter uma fk de produtos em promoções. E não o contrario.

Andre_Brito

hodrigo, acho que ele está certo… Produtos tem FK de Promoções.

Quando você lida com relações 1 para N com JPA, você pode usar uma JoinTable ou JoinColumn. Qual destas você está usando?

Dá uma olhada nesta página.

hodrigohamalho

verdade, não me atentei direito a relação…

C

clarinetabest:
Olá pessoal, tenho a seguinte situação: PRODUTOS * ---- 0…1 PROMOÇÕES.

como ficariamminhas tabelas? no mysql quando coloco uma fk (ID_PROMOCOES) do tipo int em produtos, o mesmo não aceita null, mais o produto pode ou não ter uma promoção, assim sendo as vezes esta fk em produtos irá ficar vazia, só que o bd não aceita por o campo ser int, o que fazer???

Clarinetabest,

Como o banco não aceita null nessa FK de promoções em produto ? Deve aceitar sim! A menos que essa sua FK não seja uma FK e sim uma PFK, que neste caso a FK de promoções faz parte da chave primária da tabela “produtos”.

Se for uma PFK você tem um relacionamento forte entre as tabelas “promocoes” e “produtos”. O que você deve fazer é um relacionamento fraco entre elas onde a FK ID_PROMOCOES possa ser nula na tabela produtos.

Veja uma DDL para Postgres que mostra que isso é possível e algumas instruções DML para inserção de dados nas tabelas e logo abaixo as definições das classes Produto e Promocao.

CREATE TABLE promocao
(
  id_promocao numeric(18) NOT NULL,
  CONSTRAINT id_promocao_pk PRIMARY KEY (id_promocao)
);

CREATE TABLE produto
(
  id_produto numeric(18) NOT NULL,
  id_promocao numeric(18),
  CONSTRAINT id_produto_pk PRIMARY KEY (id_produto),
  CONSTRAINT id_promocao_fk FOREIGN KEY (id_promocao)
      REFERENCES promocao (id_promocao) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

INSERT INTO promocao VALUES (1);
INSERT INTO promocao VALUES (2);

INSERT INTO produto VALUES (1, null);
INSERT INTO produto VALUES (2, 1);
INSERT INTO produto VALUES (3, 2);
INSERT INTO produto VALUES (4, null);

@Entity
@Table(name = "produto")
@javax.persistence.SequenceGenerator(name = "seqproduto",
                                     sequenceName = "seqproduto",
                                     allocationSize = 1, initialValue = 1)
public class Produto {
    @Id
    @Column(name = "id_produto", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqproduto")
    private Long idProduto;

    @ManyToOne(fetch = FetchType.EAGER )
    @JoinColumn(name = "id_promocao", referencedColumnName = "id_promocao", nullable = false)
    private Promocao promocao;

    public Long getIdProduto() {
        return this.idProduto;
    }

    public void setIdProduto(Long idProduto) {
        this.idProduto = idProduto;
    }

    public Promocao getPromocao() {
        return this.promocao;
    }

    public void setPromocao(Promocao promocao) {
        this.promocao = promocao;
    }
}

@Entity
@Table(name = "promocao")
@javax.persistence.SequenceGenerator(name = "seqpromocao",
                                     sequenceName = "seqpromocao",
                                     allocationSize = 1, initialValue = 1)
public class Promocao {
    @Id
    @Column(name = "id_promocao", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqpromocao")
    private Long idPromocao;

    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "promocao")
    @Cascade( value = { org.hibernate.annotations.CascadeType.DELETE_ORPHAN } )  
    private Set produtos;

    public Promocao() {
        this.produtos = new HashSet();
    }

    public Long getIdPromocao() {
        return this.idPromocao;
    }

    public void setIdPromocao(Long idPromocao) {
        this.idPromocao = idPromocao;
    }

    public Set getProdutos() {
        return this.produtos;
    }

    public void setProdutos(Set produtos) {
        this.produtos = produtos;
    }
}

@braços

Criado 7 de abril de 2010
Ultima resposta 8 de abr. de 2010
Respostas 4
Participantes 4