Mapeamento Hibernate one-to-many

6 respostas
TioDavid

Olá.
Estou com um problema e até errei no caso de fazer um mapeamento no XML usando Hibernate.
Direto ao ponto = tenho 3 tabelas

Empresa
Setor
Funcionário

Como faço para mapear no XML, usando Hibernate, a relação da Empresa com as outras tabelas.

Meus 3 XML`s são estes.

[size=18]Empresa.hbm.xml
[/size] Eu sei que o erro está aqui, mas não sei o que fazer

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="br.com.cinfec.model.bean.Empresa" table="empresa">
		<id name="codEmpresa">
			<generator class="native"></generator>
		</id>
		<bag name="funcionarios" table="funcionario" inverse="true" lazy="false" fetch="join" cascade="all">
			<key column="codSetor"></key>
			<one-to-many class="br.com.cinfec.model.bean.Funcionario" />
		</bag>
		<bag name="setores" table="setor" inverse="true" lazy="false" fetch="join" cascade="all">
			<key column="codSetor"></key>
			<one-to-many class="br.com.cinfec.model.bean.Setor" />
		</bag>
	</class>
</hibernate-mapping>

[size=18]Setor.hbm.xml[/size]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="br.com.cinfec.model.bean.Setor" table="setor">
		<id name="codSetor">
			<generator class="native"></generator>
		</id>
		<property name="nome"></property>
		<property name="descricao"></property>
		<many-to-one name="empresa" column="empresa_codEmpresa" lazy="false" fetch="join" cascade="all"></many-to-one>
		<bag name="funcionarios" table="funcionario" inverse="true" lazy="false" fetch="join" cascade="all">
			<key column="codSetor"></key>
			<one-to-many class="br.com.cinfec.model.bean.Funcionario" />
		</bag>
	</class>
</hibernate-mapping>

[size=18]Funcionario.hbm.xml[/size]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="br.com.cinfec.model.bean.Funcionario" table="funcionario">
		<id name="codFuncionario">
			<generator class="native"></generator>
		</id>
		<property name="nome"></property>
		<property name="telefone"></property>
		<property name="endereco"></property>
		<property name="email"></property>
		<property name="login"></property>
		<property name="senha"></property>
		<many-to-one name="empresa" column="empresa_codEmpresa" lazy="false" fetch="join"></many-to-one>
		<many-to-one name="setor" column="setor_codSetor" lazy="false" fetch="join"></many-to-one>
		
	</class>
</hibernate-mapping>

Ele dá o seguinte erro = GRAVE: Servlet /CINFEC_Program threw load() exception
org.hibernate.HibernateException: cannot simultaneously fetch multiple bags

Então… como eu faço pra referenciar empresa para as duas tabelas no msm xml?
ME AJUDEM PLS
Desde já… Muito obrigado.

6 Respostas

drsmachado

O hibernate não consegue trabalhar com fetch eager para mais de um relacionamento um para muitos/muitos para muitos.
A solução, é colocar tudo que está como lazy=“false” como lazy=“true”

P

Eu já consegui utilizar EAGER em Many-To-Many com dois destes em uma classe, dai nesses relacionamenteis utilzei a Interface Set ao inves da List

drsmachado

Posta aí os exemplos.

P
@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.MERGE, CascadeType.PERSIST})
	@JoinTable(name="documento_enquadramento", 
				joinColumns={@JoinColumn(name="docto_codigo", nullable=false, referencedColumnName="docto_codigo")}, 
				inverseJoinColumns={@JoinColumn(name="enqua_codigo", nullable=false)})
	private List<Enquadramento> termoEnquadramentos;
	
	@ManyToMany(fetch=FetchType.EAGER, cascade={CascadeType.MERGE, CascadeType.PERSIST})
	@JoinTable(name="termo_tipo_bem_apreendido", 
				joinColumns={@JoinColumn(name="termo_codigo", nullable=false)}, 
				inverseJoinColumns={@JoinColumn(name="tpbap_codigo", nullable=false)})
	private Set<TipoBemApreendido> tipoBemApreendido;
	
	@ManyToMany(fetch=FetchType.EAGER, cascade={CascadeType.MERGE, CascadeType.PERSIST})
	@JoinTable(name="termo_tipo_natureza", 
				joinColumns={@JoinColumn(name="termo_codigo", nullable=false)}, 
				inverseJoinColumns={@JoinColumn(name="tpnat_codigo", nullable=false)})
	private Set<TipoNatureza> tipoNatureza;
TioDavid

Eae pessoal…
Então, eu fiz o q me disseram, mas num funfou não hein xD
eu mudei tds os lazy pra true mas deu o mesmo erro.
Qd eu coloquei os fetch EAGER ele nem rodou,
pq disse q faltava o Statement das tabelas no XML =/
Daí tentei várias outras coisas, mas ainda não consegui.

Pensei em fazer set ao invés do bag, mas sinceramente… Não sei como fazer =p
se puderem me ajudar, fico muito grato. Mais uma vez.
abraço a tds

TioDavid
PhilipeSC:
@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.MERGE, CascadeType.PERSIST})
	@JoinTable(name="documento_enquadramento", 
				joinColumns={@JoinColumn(name="docto_codigo", nullable=false, referencedColumnName="docto_codigo")}, 
				inverseJoinColumns={@JoinColumn(name="enqua_codigo", nullable=false)})
	private List<Enquadramento> termoEnquadramentos;
	
	@ManyToMany(fetch=FetchType.EAGER, cascade={CascadeType.MERGE, CascadeType.PERSIST})
	@JoinTable(name="termo_tipo_bem_apreendido", 
				joinColumns={@JoinColumn(name="termo_codigo", nullable=false)}, 
				inverseJoinColumns={@JoinColumn(name="tpbap_codigo", nullable=false)})
	private Set<TipoBemApreendido> tipoBemApreendido;
	
	@ManyToMany(fetch=FetchType.EAGER, cascade={CascadeType.MERGE, CascadeType.PERSIST})
	@JoinTable(name="termo_tipo_natureza", 
				joinColumns={@JoinColumn(name="termo_codigo", nullable=false)}, 
				inverseJoinColumns={@JoinColumn(name="tpnat_codigo", nullable=false)})
	private Set<TipoNatureza> tipoNatureza;

Cara... me dá um exemplo de como eu posso fazer isso no meu código, por favor.
Fico muito grato se vc puder. Isso tá sendo um karma pra mim =/
E, sinceramente, ainda não consegui entender a lógica do Set, por isso não fiz ainda.
vlw

Criado 22 de dezembro de 2011
Ultima resposta 9 de mar. de 2012
Respostas 6
Participantes 3