6
respostas

Duvida com tabela

Opa, beleza? estou com uma duvida na minha tabela. Por exemplo eu penso da seguinte maneira... Uma venda pode ter um funcionario, e uma venda pode ter um cliente, e uma venda pode ter varios produtos. Então eu tenho.

@Entity
@SuppressWarnings("serial")
public class Venda implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private Double valorTotal;
    @Temporal(TemporalType.DATE)
    private Calendar dataVenda = Calendar.getInstance();
    @OneToOne
    @JoinColumn(name = "funcionario_codigo")
    private Funcionario funcionario = new Funcionario();
    @OneToOne
    @JoinColumn(name = "clinte_codigo")
    private Cliente cliente = new Cliente();
    @OneToMany(mappedBy = "venda")
    private List<Produto> produtos = new ArrayList<Produto>();

E depois com a relação oneToMany tenho que ter um atributo na minha tabela produto correto?

@Entity
@SuppressWarnings("serial")
public class Produto implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private Integer quantidade;
    private Double preco;
    @ManyToOne
    @JoinColumn(name = "fornecedor_codigo")
    private Fornecedor fornecedor = new Fornecedor();
    @ManyToOne
    @JoinColumn(name = "marca_codigo")
    private Marca marca = new Marca();
    @ManyToOne
    @JoinColumn(name = "venda_codigo")
    private Venda venda = new Venda();

Mais aqui vem minha duvida, se eu fizer desse jeito toda hora que eu cadastrar um produto o hibernate vai reclamar por causa da fk da venda no meu produto correto? Está correto dessa maneira? Pois pensando agora acho que está muito mais muito errado!!

6 respostas

Oi Alisson,

Você não precisa ter um atributo do tipo Venda na entidade de Produto, você só precisaria disso se quisesse mapear o relacionamento bidirecional mesmo.

Caso você queira mapear o relacionamento nas duas pontas, o mappedBy tem que ser no @ManyToOne do atributo Venda da entidade Produto.

Abraço!

Joviane entendi, mais ai agora surgiu uma outra duvida, se eu não quiser um relacionamento bidirecional eu não precisa do

   @ManyToOne
    @JoinColumn(name = "venda_codigo")
    private Venda venda = new Venda();

Certo? Então é so apagar, mais agora na minha venda, queria mostrar o codigo do produto que foi vendido. Mais então eu tirando isso o meu código estára correto?

@Entity
@SuppressWarnings("serial")
public class Venda implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private Double valorTotal;
    @Temporal(TemporalType.DATE)
    private Calendar dataVenda = Calendar.getInstance();
    @OneToOne
    @JoinColumn(name = "funcionario_codigo")
    private Funcionario funcionario = new Funcionario();
    @OneToOne
    @JoinColumn(name = "clinte_codigo")
    private Cliente cliente = new Cliente();
    @OneToMany(mappedBy = "venda")
    private List<Produto> produtos = new ArrayList<Produto>();

@Entity
@SuppressWarnings("serial")
public class Produto implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private Integer quantidade;
    private Double preco;
    @ManyToOne
    @JoinColumn(name = "fornecedor_codigo")
    private Fornecedor fornecedor = new Fornecedor();
    @ManyToOne
    @JoinColumn(name = "marca_codigo")
    private Marca marca = new Marca();

Deixando assim estára correto? Mais como te disse não tera nada na minha venda que possa marca algo do produto?

Oi Alisson,

Na venda você tem a lista de produtos vendidos, através dela você consegue buscar as informações do produto daquela venda.

Abraço!

Joviane mais no banco de dados eu não terei um joinCollun para a junção de tabelas né? então está correto dessa maneira?

Está certo sim Alisson. Ele irá referenciar o produto_id na tabela de junção... O JoinColumn é só para mudar o nome da coluna se você quiser.

Abraço!

Nossa você me tirou uma duvida tremenda agora, sempre achei que o joinColumn era para a junção de tabelas, o.o Obrigado de verdade kkkk