Mapeamento Hibernate Annotation

9 respostas
M

Boa tarde pessoal seguinte... estou começando agora a utilizar o hibernate e estou com duvidas em mapeamento

tenho minha classe Pedido

package br.com.projeto.beans;

import java.util.Date;

import javax.persistence.Entity;


import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;


import javax.persistence.OneToOne;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
public class Pedido {

	@Id
	@GeneratedValue
	private Integer id;
	private Date dataPedido;
	private Float valorTotal;
	@OneToOne(cascade = javax.persistence.CascadeType.PERSIST)
	@JoinColumn(name = "id")
	@Fetch(FetchMode.JOIN)
	private Pessoa pessoa;



	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Date getDataPedido() {
		return dataPedido;
	}

	public void setDataPedido(Date dataPedido) {
		this.dataPedido = dataPedido;
	}

	public Float getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(Float valorTotal) {
		this.valorTotal = valorTotal;
	}
}

minha classe produto

package br.com.projeto.beans;

import java.util.Collection;

import javax.persistence.Entity;

import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Produto {

	@Id
	@GeneratedValue
	private Integer id;
	private String descricao;
	private Integer quantidade;
	private Float precoCusto;
	private Float precoVenda;
	private String obs;
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_pessoafornecedor")
	private Fornecedor fornecedor;
	@OneToMany(cascade = javax.persistence.CascadeType.PERSIST)
	@JoinColumn(name = "id")	
	private Collection<Itens> itens;

	public Collection<Itens> getItens() {
		return itens;
	}

	public void setItens(Collection<Itens> itens) {
		this.itens = itens;
	}

	public String getObs() {
		return obs;
	}

	public void setObs(String obs) {
		this.obs = obs;
	}

	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Integer getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(Integer quantidade) {
		this.quantidade = quantidade;
	}

	public Float getPrecoCusto() {
		return precoCusto;
	}

	public void setPrecoCusto(Float precoCusto) {
		this.precoCusto = precoCusto;
	}

	public Float getPrecoVenda() {
		return precoVenda;
	}

	public void setPrecoVenda(Float precoVenda) {
		this.precoVenda = precoVenda;
	}

}

e minha classe itens

package br.com.projeto.beans;

import java.util.Collection;

import javax.persistence.Entity;


import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;

@Entity
public class Itens {

	@Id
	@GeneratedValue
	private Integer id;
	private Integer quantidade;
	@ManyToMany(cascade = javax.persistence.CascadeType.PERSIST)
	@JoinColumn(name = "id")
	private Collection<Produto> produto;

	

	public Collection<Produto> getProduto() {
		return produto;
	}

	public void setProduto(Collection<Produto> produto) {
		this.produto = produto;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(Integer quantidade) {
		this.quantidade = quantidade;
	}

}

minnha duvida é como fazer o mapeamento entre elas, quero fazer atraves de annotations

obrigado

9 Respostas

otaviojava

Você pode fazer a relação usando as anotações
@ManyToMany @OneToMany @OneToOne @ManyToOne

Pelo exemplo que você postou você está usando, qual é realmente sua dúvida.

M

é que não sei como ficaria o relacionamento entre essas tabelas

otaviojava

o nome das anotações já dizem o que elas fazem.

Ou seja você pode usar as seguintes anotações

OneToOne uma por uma
OneToMany uma para muitas
etc.

Espero ter ajudado.

M

problema

package br.com.projeto.beans;

import java.util.Collection;
import java.util.Date;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

import javax.persistence.OneToOne;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
public class Pedido {

	@Id
	@GeneratedValue
	private Integer id;
	private Date dataPedido;
	private Float valorTotal;
	@OneToOne(cascade = javax.persistence.CascadeType.PERSIST)
	@JoinColumn(name = "id")
	@Fetch(FetchMode.JOIN)
	private Pessoa pessoa;

	@OneToMany(cascade = javax.persistence.CascadeType.PERSIST)
	@JoinColumn(name = "id")
	@Fetch(FetchMode.JOIN)
	private Collection<Itens> itens;

	@OneToMany(cascade = javax.persistence.CascadeType.PERSIST)
	@JoinColumn(name = "id")
	@Fetch(FetchMode.JOIN)
	private Collection<TipoDeServico> tipoDeServico;

	public Collection<TipoDeServico> getTipoDeServico() {
		return tipoDeServico;
	}

	public void setTipoDeServico(Collection<TipoDeServico> tipoDeServico) {
		this.tipoDeServico = tipoDeServico;
	}

	public Collection<Itens> getItens() {
		return itens;
	}

	public void setItens(Collection<Itens> itens) {
		this.itens = itens;
	}

	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Date getDataPedido() {
		return dataPedido;
	}

	public void setDataPedido(Date dataPedido) {
		this.dataPedido = dataPedido;
	}

	public Float getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(Float valorTotal) {
		this.valorTotal = valorTotal;
	}
}

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/Projeto_Faculdade] threw exception [/CadastroFornecedor.jsp(67,3) '#{fornecedorBean.listfornecedor != null}' Error reading 'listfornecedor' on type br.com.projeto.controller.FornecedorBean] with root cause
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94)
at org.hibernate.loader.entity.EntityLoader.(EntityLoader.java:120)
at org.hibernate.loader.entity.EntityLoader.(EntityLoader.java:72)
at org.hibernate.loader.entity.EntityLoader.(EntityLoader.java:55)
at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:133)
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1898)
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1921)
at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3182)
at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3175)
at org.hibernate.persister.entity.SingleTableEntityPersister.postInstantiate(SingleTableEntityPersister.java:728)
at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:357)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
at br.com.projeto.util.HibernateUtil.(HibernateUtil.java:17)
at br.com.projeto.dao.HibernateDao.getBeans(HibernateDao.java:47)
at br.com.projeto.controller.FornecedorBean.getListfornecedor(FornecedorBean.java:73)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.parser.AstNotEqual.getValue(AstNotEqual.java:38)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:106)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:193)
at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:421)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
at com.sun.faces.application.view.JspViewHandlingStrategy.doRenderView(JspViewHandlingStrategy.java:431)
at com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:233)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:509)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

L

Mude de Collection<…> para Set<…> para corrigir esse erro.

M

pow obrigado quebro um galhão

só não entendi esse set ele vai uma coleção de itens tmb?

L

Sim, vc só vai trocar de Collection para java.util.Set, que é uma sub-interface de Collection(não sei se essa era sua dúvida).

Eu tive muito esse problema quando sai do mapeamento via XML para mapeamento usando anotações, agora sempre mapeio usando Set.

M

agora entendi só mais uma duvida eu importo o set do java.util?

L

Isso. java.util.Set.

Criado 11 de outubro de 2011
Ultima resposta 11 de out. de 2011
Respostas 9
Participantes 3