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