Ajuda! Relacionamentos em Hibernate

9 respostas
kvnallen

Pessoal, estudei pra caramba, entendi os relacionamentos e tal, mas o que eu queria saber era na prática mesmo, sei que vai parecer que estou pedindo tudo pronto, mas é que quero estudar e aprender com os erros, então queria a ajuda de vocês, tenho algumas classes que estou mapeando com o Hibernate, já fiz algumas coisas tentando aprender, mas tá meio complicado pra mim ^^, as classes são essas:

Bebida.java

@Entity
public class Bebida {

	@Id
	@GeneratedValue
	private long id;

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

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

	@Column(name = "preco_compra")
	private String precoCompra;

	@Column(name = "preco_venda")
	private String precoVenda;

	@ManyToMany
	@JoinColumn(name="id_mesa")
	private List<Mesa> mesas;
	

}

Fornecedor.java

@Entity
public class Fornecedor {

	@Id
	@GeneratedValue
	private long id;

	@Column(name = "nome", nullable = false, unique=true , length = 70)
	private String nome;

	@Column(name = "telefone", length = 20)
	private String telefone;

	@Column(name = "endereco", length = 70)
	private String endereco;

	@Column(name = "numero", length = 6)
	private String numero;

	@Column(name = "bairro", length = 20)
	private String bairro;

	@Column(name = "conta", length = 30)
	private String conta;

	@Column(name = "banco", length = 30)
	private String banco;

	@Column(name = "cnpj", length = 14)
	private String cnpj;

	@Column(name = "email", length = 40)
	private String email;
	
	@OneToMany
	@Fetch(FetchMode.JOIN)
	@JoinColumn(name="id_ingrediente")
	private List<Ingrediente> ingredientes;

	}

Ingrediente.java

package modelo;

@Entity
public class Ingrediente {

	@Id
	@GeneratedValue
	private long id;

	@ManyToMany
	@Fetch(FetchMode.JOIN)
	@JoinColumn(name="id_ingrediente")
//	@Column(name = "nome", nullable = false)
	private List<Sabor> nomes;

	@Column(name = "quantidade", nullable = false)
	private String quantidade;

	@Column(name = "preco_compra")
	private String precoCompra;

	@Column(name = "preco_venda")
	private String precoVenda;

	@Column(name = "lucro")
	private double lucro;

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

	@ManyToOne()
	@JoinColumn(name="id_fornecedor")
	@Fetch(FetchMode.JOIN)
	private Fornecedor fornecedor;

	}

Mesa.java

@Entity
public class Mesa {

	@Id
	@GeneratedValue
	private long id;

	@Column(name="valor_total")
	private String valorTotal;

	@Column(name="produto")
	
	@ManyToMany
	private List<Bebida> bebidas;
	
	@ManyToMany
	@JoinColumn
	private List<Pizza> pizzas;

}

Pizza.java

@Entity
public class Pizza {

	@Id
	@GeneratedValue
	private long id;

	@ManyToMany(fetch=FetchType.EAGER)
	@JoinColumn(name="id_sabor")
	private List<Sabor> sabores;

	@ManyToOne
	@Fetch(FetchMode.JOIN)
	@JoinColumn(name="id_preco_sabor")
	private Sabor precoProducao;

	@Column(name = "preco_venda", nullable = false)
	private String precoVenda;

	@Column(name = "tamanho", nullable = false)
	private String tamanho;
	
	@ManyToMany
	@JoinColumn(name="id_mesa")
	private List<Mesa> mesas;

	}

Sabor.java

@Entity
public class Sabor {

	@GeneratedValue
	@Id
	private long id;
	
	@Column(name="nome")
	private String nome;
	
	@Column(name="preco_producao")
	private double precoProducao;
	
	@ManyToMany(fetch=FetchType.EAGER)
	@Fetch(FetchMode.JOIN)
	@JoinColumn(name="id_ingrediente")
	private List<Ingrediente> ingredientes;
	
	
	private Ingrediente quantidade;

	
	
}

Obs: Removi os getters/setters para ficar mais fácil de ler.

Então seria o seguinte:

[b]Um ingrediente pode ter um fornecedor, e um fornecedor pode ter vários ingredientes.
Um ingrediente pode estar em vários sabores, e um sabor pode ter vários ingredientes (Não sei se está certo)
Uma bebida pode ter um fornecedor, e um fornecedor pode ter várias bebidas.
A mesa pode ter várias bebidas/pizzas, e pizzas/mesas poderão estar em várias mesas.
E o preco de produção da pizza vai ser o mesmo do preco de produção do sabor, então ele teria que tipo herdar aquela variavel de lá…

Queria a ajuda de vocês de como fazer isso na prática, obrigado, se puderem me ajudar ficarei muito, mas muito grato!

9 Respostas

drsmachado

Na minha visão:
Ingrediente pode ter vários fornecedores e cada fornecedor pode ter vários ingredientes.
Ex.: Mercado A vende queijo, mercado b vende queijo e presunto, mercado c vende presunto e tomate.
Ingrediente pode estar em vários sabores e cada sabor pode ter vários ingredientes.
Ex.: Quatro queijos tem mussarela, catupiry, cheddar e provolone, mussarela tem tomate e mussarela.
Bebida pode ter vários fornecedores e fornecedor várias bebidas.
Ex.: Coca cola e Pepsi, cervejas.
Uma pizza pode ter vários sabores e um sabor pode estar em várias pizzas.
Brotinho calabresa, média frango com catupiry e quatro queijos.

Bebida e ingrediente são produtos, logo, compartilham os mesmos atributos (nome, unidade de medida, preco unitario, fornecedores).

Pra mim, preço = custo de ingredientes + água + luz + telefone + salário funcionários (pizzaiolo, atendente, entregador, garçons) + lucro esperado.

Mesa terá produtos, pizza e bebida são produtos, logo, se encaixam no caso acima.

Ou seja

Ingrediente N ---- M Fornecedor
Ingrediente N — M Sabor
Bebida N — M Fornecedor

Produto
código : Long
nome : String
precoUnitario : Float
unMedida : String
vlUnMedida : Float
tpProduto : String
fornecedores: List

Ingrediente extends Produto
Bebida extends Produto

Fornecedor
codigo : Long
nome : String
produtos : List

Pizza extends Produto
sabores : List
tamanho : String

Mesa
produtos : List
totalAPagar : FLoat
totalPago : Float
formaDePagamento : String

Claro que aí cabem muitos outros pontos de vista, por exemplo, criar uma classe Preco, para representar os diversos tipos de preço que cada produto possui, etc.

Primeiro pense no modelo correto, depois organize sua modelagem e mapementos.

kvnallen

Obrigado pelas dicas amigo, peguei suas dicas vou implementar aqui… mas se eu fosse fazer no código, como ficaria ?

drsmachado

O que você já conseguiu fazer?
Quais são as dúvidas (lembrando que dúvida surge quando se tenta fazer e, em determinado ponto, não se consegue mais ir adiante)?
Qual foi o ponto em que as coisas ficaram obscuras?
Já pensou em montar a estrutura do banco de dados (DER)? Se sim, já fez? Se sim, como ficou?
Já pensou nas queries (JOIN, INNER, OUTER, OUTER LEFT, etc)?

Sem isso, sinceramente, vai ficar difícil…

kvnallen

do meu projeto já criei os métodos básicos (CRUD), criei as entidades.
Minha dúvida é onde aplicar no banco esses relacionamentos, tipo ManyToMany, OneToOne, e outras coisas que tem nele por exemplo @Fetch(fetch=FetchType.EAGER),
Não montei um DER.
Sou bem iniciante nessa parte, o que seriam essas queries ?

Confesso que estou bem errado, é um projeto que estou fazendo para a faculdade, um integrante do meu grupo que fez a análise de requisitos não fez certo, eu tive que mudar várias coisas, isso já me atrapalhou, mas estou tentando consertar as coisas.

drsmachado

Então vamos lá.
Você precisa começar definindo corretamente os relacionamentos entre as classes, quem compõe quem e quem herda de quem.
Análise e design, assim como codificação permitem várias interpretações e cada um faz a seu modo.
Embora não seja requisito, seria muito bom você conhecer um pouco de SQL para trabalhar com hibernate, afinal, você deve saber o que espera do banco de dados, para poder interagir com ele.
Pensa bem, se vc quer persistir uma entidade, vc usa um recurso do hibernate. Agora, como faria isso manualmente? E se fosse para listar? Deletar?

Depois de definir a relação que cada classe tem com as demais, fica mais simples verificar onde existe composição e onde tem herança, daí, mapear os vários relacionamentos fica mais simples.

kvnallen

Eu sei fazer toda essa parte do hibernate, de listar, excluir, e tal, estamos estudando HQL agora na facul, já trabalhei com jdbc, só essa parte de relacionamentos que me dá trabalho kkk.

Acho que porque antes eu fiz um projetinho simples, que não precisava de uma lista, mas no caso desse novo projeto a pizza já necessita de uma lista de ingredientes, nunca tinha usado, então coisa nova pra mim…

drsmachado
@Entity
@Table("table_a")
public class A implements Serializable {
	@Id
	@GeneratedValue
	private Long aId;
	@Column(name="Column2", nullable=false, length=100)
	private String col2;
	@ManyToMany(cascade = CacadeType.ALL)
		@JoinTable(
			name="tablea_tableb",
			joinColumns = {
				@JoinColumn(name = "a_id")
			},
			inverseJoinColumns{
				@JoinColumn(name = "b_id")
			}
	private List<B> bs;
	
	//getters e setters
			
}
@Entity
@Table("table_b")
public class B implements Serializable {
	@Id
	@GeneratedValue
	private Long bId;
	@Column(name="Column_1", nullable=false, length=100)
	private String col1;
	@ManyToMany(cascade = CacadeType.ALL)
		@JoinTable(
			name="tablea_tableb",
			joinColumns = {
				@JoinColumn(name = "b_id")
			},
			inverseJoinColumns{
				@JoinColumn(name = "a_id")
			}
	private List<A> as;
	
	//getters e setters
			
}

Um simples exemplo.
Tenta aí.

drsmachado

Créditos pelo exemplo

kvnallen

Muito obrigado pela ajuda e pela paciência, só me resta estudar aqui ! :smiley:

Criado 13 de abril de 2012
Ultima resposta 13 de abr. de 2012
Respostas 9
Participantes 2