Hibernate+mapeamento+anotation+inner join

Olá, pessoal
Estou com sérias dificuldades para mapear minhas classes de persistencia, mesmo consultando a documentação do hibernate anotation e fazendo consultas no guj não conseguí resolver meu problema. Segue meu codigo que estou utilizando, gostaria da sua opinião para resolver meu prolblama.

colaborador N*-----------------------> 1 Setor

Como faço para mapear essas classes

--------------------------------MAPEAMENTO DO COLABORADOR---------------------------
package src.portaria.vo;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;


@Entity
@Table(name = "colaborador")
public class Colaborador implements Serializable{

	public Colaborador(){
		
	}
	
	 @Id //define a chave da classe a ser mapeada 
	 private Long Col_codigo;      
	 private String Col_Set_codigo;
	 private String Col_nome;
	 private String Col_funcao;
	 private String Col_fone;	 
	 
	 @OneToMany(mappedBy="Colaborador")
	 @MapKey(name="Col_Set_codigo")
	 private List <Setor> setor;//Estou utilizando esse tipo de liste mas não sei seu real sentido
                 //vc pode me explicar eu poderia utilizar simplismente o seguinte: 
	//private Setor setor; [b]qual é a diferença dissso para isso[/b] private List <Setor> setor;
	
	 @ManyToOne(fetch = FetchType.LAZY)  
	 @JoinColumn(name="Col_Set_codigo",insertable=false, updatable=false, nullable = true)  
	 @Fetch(FetchMode.JOIN) 
	 private Colaborador colaborador;
	 
	 
	
//	public List<Setor> getSetor() {
//		return setor;
//	}
//	public void setSetor(List<Setor> setor) {
//		this.setor = setor;
//	}
//	
	
	

	public Long getCol_codigo() {
		return Col_codigo;
	}

	public void setCol_codigo(Long col_codigo) {
		Col_codigo = col_codigo;
	}

	public String getCol_fone() {
		return Col_fone;
	}

	public void setCol_fone(String col_fone) {
		Col_fone = col_fone;
	}

	public String getCol_funcao() {
		return Col_funcao;
	}

	public void setCol_funcao(String col_funcao) {
		Col_funcao = col_funcao;
	}

	public String getCol_nome() {
		return Col_nome;
	}

	public void setCol_nome(String col_nome) {
		Col_nome = col_nome;
	}

	public String getCol_Set_codigo() {
		return Col_Set_codigo;
	}

	public void setCol_Set_codigo(String col_Set_codigo) {
		Col_Set_codigo = col_Set_codigo;
	}
	 
	 
}





-------MAPEAMENTO DO SETOR--------------------------------------

package src.portaria.vo;

import javax.persistence.CascadeType;
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;
import javax.persistence.Table;
import javax.persistence.Transient;

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


@Entity
@Table(name = "setor")
public class Setor {	
	 
//    @SequenceGenerator(name="seqPed", sequenceName="seqPed", initialValue=1)   
//    @GeneratedValue(generator="seqPed", strategy=GenerationType.AUTO)   
	@Id //define a chave da classe a ser mapeada
	private Long Set_codigo;
	private String Set_nome;
	private String Set_descricao;
	private String Set_localizacao;
	

	 @ManyToOne(cascade=CascadeType.PERSIST)
	 @Fetch(FetchMode.JOIN)
	 @JoinColumn(name = "Set_codigo", insertable=false, updatable=false)
	private Colaborador colaborador;


	 public Colaborador getSetor() {
		 return this.colaborador;
	 }
	 public void setColaborador(Colaborador colaborador) {
		 this.colaborador = colaborador;
	 }
//

	
	public Long getSet_codigo() {
		return Set_codigo;
	}
	public void setSet_codigo(Long set_codigo) {
		Set_codigo = set_codigo;
	}
	public String getSet_descricao() {
		return Set_descricao;
	}
	public void setSet_descricao(String set_descricao) {
		Set_descricao = set_descricao;
	}
	public String getSet_localizacao() {
		return Set_localizacao;
	}
	public void setSet_localizacao(String set_localizacao) {
		Set_localizacao = set_localizacao;
	}
	public String getSet_nome() {
		return Set_nome;
	}
	public void setSet_nome(String set_nome) {
		Set_nome = set_nome;
	}	
	
	public String toString(){
		return this.Set_nome;
	}
	
}

Estou utilizando a seguinte consulta em hsql está correto a clausula juntamente com o método?


package src.portaria.dao;

import java.util.Iterator;
import java.util.List;

import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import src.portaria.utils.ConnectDB;
import src.portaria.vo.Colaborador;
import src.portaria.vo.Visitante;


public class ColaboradorDAO {

	private Session session;
	
	public ColaboradorDAO() throws Exception {

	}
	

		public List procurarPorNome(String Col_nome) {
			
			session = ConnectDB.getInstance();		
			Transaction tx = session.beginTransaction(); 	
			
			Query select = session.createQuery("FROM Colaborador as colaborador inner join colaborador.Setor Where Col_nome like :entrada");
						
			select.setString("entrada", Col_nome);
			
			//retorna uma unica linha de entrada
			List list = select.list();
			
			tx.commit();
			session.close();
			
			return list;		
		}//fim	
    
}

Se for preciso mais informações para solucionar o problema pode pedir estou precisando muito de sua ajuda! blz

Estarei esperando atentamento sua reposta qualquer colaboração é muito importante tanto para mim quanto para os outros colegas iniciantes no hibernate

na verdade o mapeamento esta invertido

na classe Colaborador deveria ter apenas um Setor e não um list.

já que cada colaborador pertence a apenas um sertor.

e a classe Setor deveria ter um List de colaboradores.

então, não entendo a diferença entera List e Setor setor; em que caso devo utilizar determinado tipo de declaração???

    Os anotation que estou utilizando para mapear as classes estão corretos está faltando algo mais?

Outra duvida é, no meu caso tenho um relacionamento 1 para N sou obrigado a utilizar o OneToMany em uma classe e o ManyToOne em outra? ou posso simplismente utilizar um dos dois para mapear?

Para mapear a minha classe Setor os anotations abaixo resolve ou irá faltar algo?

@OneToMany(mappedBy="Colaborador")   
@MapKey(name="Col_Set_codigo")   

quando vc utiliza

List na classe colaborador, você está dizendo que um Colaborador pode estar em muitos setores dai usar a annotation @OneToMany.

e vice versa.

entendeu?

[quote=hvivox] Os anotation que estou utilizando para mapear as classes estão corretos está faltando algo mais?
Outra duvida é, no meu caso tenho um relacionamento 1 para N sou obrigado a utilizar o OneToMany em uma classe e o ManyToOne em outra? ou posso simplismente utilizar um dos dois para mapear?

Para mapear a minha classe Setor os anotations abaixo resolve ou irá faltar algo?

@OneToMany(mappedBy="Colaborador") @MapKey(name="Col_Set_codigo") [/quote]

pode utilizar somente um dos dois…

tendo os dois é para relacionamento bidirecional

Então na minha classe colaborador ficaria desssa forma abaixo? É necessário por o @JoinColumn(name = “Set_codigo”

 @ManyToOne(cascade=CascadeType.PERSIST)   
 @Fetch(FetchMode.JOIN)   
 @JoinColumn(name = "Set_codigo", insertable=false, updatable=false)   
  private List<Setor> setor;  

De que forma devo mapear para fazer a seguinte consulta abaixo utiliando o inner join? A minha consulta em hsql está certa ou não?

public class ColaboradorDAO {   
  
    private Session session;   
       
    public ColaboradorDAO() throws Exception {   
  
    }   
       
  
        public List procurarPorNome(String Col_nome) {   
               
            session = ConnectDB.getInstance();         
            Transaction tx = session.beginTransaction();       
               
            Query select = session.createQuery("FROM Colaborador as colaborador inner join colaborador.Setor Where Col_nome like :entrada");   
                           
            select.setString("entrada", Col_nome);   
               
            //retorna uma unica linha de entrada   
            List list = select.list();   
               
            tx.commit();   
            session.close();   
               
            return list;           
        }//fim     
       
}  

Desde já agradeço a colaboração!!!

não sabia que hibernate+annotation fosse tão dificil a ponto de poucas pessas terem respostas as esclarecer as dúvidas

OI pessoal, ninguém se habilita :cry:

Oi pessoal preciso muito tirar essas dúvidas acima!!!