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