Mapeamento onetomany no hibernate usando annotations

0 respostas
lrgalego

Olá amigos,
O que ocorre é o seguinte, estou fazendo a persistencia de um banco de dados que possui a seguinte
relação

tabela company (
 int id
 varchar texto

)

tabela domain(
 int id
 int id_a -> referencia id da tabela a
 varchar texto
)

quero através do hibernate criar uma relação onetomany e também uma manytone entre as tabelas,
abaixo a classe Company

package br.com.azzu.accounter.domain.vo;

import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table( name="TAB_COMPANIES" )
public class Company {
	@Id @GeneratedValue
	@Column( name="Id" )
	private int id;
	
	@Column( name="Name" )
	private String name;
	
	@OneToMany ( targetEntity=Domain.class, mappedBy = "company", fetch = FetchType.EAGER )
	private Collection<Domain> domains;

	public int getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public Collection<Domain> getDomains() {
		return domains;
	}

	public void setDomains(Collection<Domain> domains) {
		this.domains = domains;
	}
	
	public String toString(){
		StringBuilder sb = new StringBuilder( "Company { " );
		sb.append( "Id:" );
		sb.append( id );
		sb.append( ", Name:" );
		sb.append( name );
		sb.append( ", Number of domains:" );
		sb.append( getDomains().size() );
		sb.append( " }" );
		
		return sb.toString();
	}
	
}

Estou usando o mapeamento via anotações, usei a anotação
@OneToMany ( targetEntity=Domain.class, mappedBy = “company”, fetch = FetchType.EAGER ) para referenciar com a classo domain que segue abaixo:

@Entity
@Table(name = "TAB_DOMAINS" )
public class Domain {
	
	@Id @GeneratedValue
	@Column( name="Id" )
	private int id;
	
	@Column( name="Domain" )
	private String domain;
	
	@Column( name="Description" )
	private String description;
	
	@ManyToOne( targetEntity = Company.class, fetch=FetchType.EAGER )
	@JoinColumn( name="Id_Company" )  
	private Company company;

	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public Company getCompany() {
		return company;
	}
	public void setCompany(Company company) {
		this.company = company;
	}	
	
	public String getDomain() {
		return domain;
	}
	public void setDomain(String domain) {
		this.domain = domain;
	}
	
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	
	public String toString(){
		StringBuilder sb = new StringBuilder( "Domain { " );
		sb.append( "Id:" );
		sb.append( id );
		sb.append( ", Domain:" );
		sb.append( domain );
		sb.append( ", Description:" );
		sb.append( description );
		sb.append( ", Company:" );
		sb.append( company );
		sb.append( " }" );
		
		return sb.toString();
	}
	
}

a mesma tem uma relação @ManyToOne( targetEntity = Company.class, fetch=FetchType.EAGER ).

Quando faço o select de todas as instancias de Domínio, me veem perfeitamente o numero correto de instancias, com o objeto company de cada uma de maneira correta.

entretanto qdo faço a seleção de todos os objetos do tipo Company, uma instância de company é criada para cada entrada que exista em Domain que referencia a chave estrangeira. exemplo:

temos Company:

Id Name
1 nome 1
2 nome 2

temos domain
Id Id_a domain
1 1 bubu
2 1 bubu

o meu retorno ao buscar por company eh
List( company( id=1, name=nome1, domains=( 1, 2) ) ; company( id=1, name=nome1, domains=( 1, 2) )
duas instancias!!! pq duas? como faço para que não ajam repetições?
obrigado a quem teve paciencia de ver todo o imenso post

Criado 14 de abril de 2008
Respostas 0
Participantes 1