Mapeamento Hibernate

16 respostas
diogogama

Galera, é o seguinte estou com uma classe cliente:

@Entity
@Table(name="clientes")
public class Cliente implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private boolean juridica;
    private String nomeOuRazaoSocial;
    private String nomeFantasia;
    private String cpfOuCnpj;
    private String rgOuInscricaoEstadual;
    @Temporal(TemporalType.DATE)
    private DateTime dataNacimentoOuCriacaoEmpresa;
    @Temporal(TemporalType.DATE)
    private DateTime dataAdesao;
    private Double limite;
    private Double saldo;

    @OneToOne(cascade = CascadeType.ALL)
    private Endereco endereco;
    
    @OneToOne(cascade = CascadeType.ALL)
    private DadosBancarios dadosBancarios;
    
    @OneToOne(mappedBy = "comprador")
    private Compra compra;
    
    @OneToOne(mappedBy = "vendedor")
    private Compra venda;

//getters e setters
e uma classe venda:
@Entity
@Table(name="compras")
public class Compra implements Serializable {
    
    @Id
    @GeneratedValue
    private Long id;
    private String token;
    private Double valorDaCompra;
    private Double valorPago;
    private DateTime dataDaCompra;
    private DateTime horaDaCompra;
    @OneToOne(cascade = CascadeType.ALL)
    private Cliente comprador;
    @OneToOne(cascade = CascadeType.ALL)
    private Cliente vendedor;
    private DateTime dataPagamento;
    @OneToMany(mappedBy="compras")
    @OrderBy("compra")
    private List<Pagamento> pagamentos;

//getters e setters

Minha dúvida é a seguinte:

a classe compra possui dois Clientes (comprador e vendedor) como faço esse mapeamento?

Sei que a classe compra terá duas composições de cliente, mas como faço em cliente?

Vlw.

16 Respostas

diogogama

ninguém?

drsmachado

São clientes do mesmo tipo? Eu creio que não, logo, a classe compra possui um Comprador e um Vendedor (Cliente seria, apenas, uma superclasse de ambos).

diogogama

drsmachado, vlw ae pela resposta…

Mas são clientes exatamente iguais.

Imagine que eu estou te vendendo uma parada hoje. Eu sou o vendedor e você o comprador, mas amanhã pode ser o inverso, sacou?

ou seja vai haver dois relacionamentos com a mesma tabela Compras vai ter um comprador (Cliente) e um vendedor (Cliente).

Se puder me dar uma luz agradeço.

fredericomaia10

Não acho que a modelagem esteja correta. Você mesmo disse que tem um Comprador e um Vendedor, se ambos podem ser clientes use composição ou herança e crie um tipo pra cada.

diogogama

Não entendi? Eu tenho dois clientes, vou usar herança só pra dar um nome diferente e chamar um de comprador e outro de vendedor? não me parece correto… A única questão é que um uma hora poderá ser vendedor e outra hora comprador, mas os dados são os mesmos.

diogogama

Vou tentar explicar melhor.

Imagine o mercado livre. A tabela de clientes dele não distingue comprador de vendedor. Todos são potenciais compradores e vendedores. É mais ou menos isso. o que vai mudar é na regra de negócio e não na tabela.

Quando for mapear uma compra, você vai ter um cliente comprador e um cliente vendedor.

Consegui explicar melhor?

drsmachado

diogogama:
Vou tentar explicar melhor.

Imagine o mercado livre. A tabela de clientes dele não distingue comprador de vendedor. Todos são potenciais compradores e vendedores. É mais ou menos isso. o que vai mudar é na regra de negócio e não na tabela.

Quando for mapear uma compra, você vai ter um cliente comprador e um cliente vendedor.

Consegui explicar melhor?


Como o fred disse, está errado.
No mínimo você tem dois atributos diferentes, de mesma classe, comprador e vendedor.

public class Compra{
    private Cliente vendedor;
    private Cliente comprador;
    //Outros atributos
    //Getters e setters
}
diogogama

Poxa, então vocês não leram minha dúvida???

Se olharem a classe Compra lá tem os dois atributos, minha dúvida foi o mapeamento, peço por favor que leiam minha primeira msg para poderem me ajudar, pois lá está feito da forma que falaram.

hvivox

Camarada,

Eles estão certos, faz assim:
cria a classe pai chamado pessoa
Pessoa terá classes filhas chamadas Comprador, Vendedor etc

Na tua classe compra terá algo do tipo:

public class Compra {
 Pessoa comprador = new Comprador();
 Pessoa vendedor = new Vendedor();

}

Lá no teu banco de dados vc pode criar a tabela Pessoa de várias formas recomendo que vc crie apenas uma tabela chamada pessoa lá vc coloca um campo chamado tipo(0 - comprador, 1 - vendedor)

hvivox

Não esquece de por {RESOLVIDO} no titulo do post

diogogama

porra... ta foda hoje hein... rs...

Vocês viram lá em cima na pergunta que coloco

public class Cliente implements Serializable {  
@OneToOne(mappedBy = "comprador")  
    private Compra compra;  
 @OneToOne(mappedBy = "vendedor")  
    private Compra venda;  
}

public class Compra implements Serializable { 
@OneToOne(cascade = CascadeType.ALL)  
    private Cliente comprador;  
    @OneToOne(cascade = CascadeType.ALL)  
    private Cliente vendedor;  
}

ou seja, minha classe compra já compõe 2 clientes... comprador e vendedor... minha dúvida é como faço esse mapeamento...

Ps.: Vou colocar resolvido quando tiver resolvido, não se preocupe que não esqueço....

hvivox

Por nada camarada, é sempre um prazer ajudar.

diogogama

Então me ajuda…

alexporto90

Um cliente do tipo comprador ter muitas compras.
Um cliente do tipo vendedor tem muitas vendas.
Uma compra terá um vendedor e um cliente.

public class Cliente implements Serializable {   
	@OneToMany(mappedBy = "comprador")
	private List<Compra> compras;

	@OneToMany(mappedBy = "vendedor")
	private List<Compra> vendas;
}
public class Compra implements Serializable {   
	@ManyToOne
	private Cliente comprador;
	@ManyToOne
	private Cliente vendedor;
}
fredericomaia10

alexporto90:
Um cliente do tipo comprador ter muitas compras.
Um cliente do tipo vendedor tem muitas vendas.
Uma compra terá um vendedor e um cliente.

public class Cliente implements Serializable {   
	@OneToMany(mappedBy = "comprador")
	private List<Compra> compras;

	@OneToMany(mappedBy = "vendedor")
	private List<Compra> vendas;
}

public class Compra implements Serializable { @ManyToOne private Cliente comprador; @ManyToOne private Cliente vendedor; }

Se vai ter só uma entidade mesmo para representar os dois. É isso aí. Faltava trocar por @ManyToOne.
Agora, seguindo assim como é que você vai diferenciar quando é comprador e quando é vendedor? Nunca haverão haver regras diferentes para quando é um ou outro?

fredericomaia10

Outra coisa, como é que você validaria estes atributos? O.o

private String cpfOuCnpj; private String rgOuInscricaoEstadual;

Criado 5 de setembro de 2013
Ultima resposta 11 de set. de 2013
Respostas 16
Participantes 5