Erro salvar hibernate jsf chave estrangeira

Sou iniciante em Hibernate e jsf e estou com o seguinte erro: o Cenário é o seguinte tenho 2 tabelas usuários e perfis os meus perfis funcionam normalmente porem não consigo salvar meus usuários, aparentemente o meu código não esta localizando a minha chave estrangeira seguem abaixo o log de erro e meu código, já testei de várias forma fiz diversas alterações porem não consigo fazer com que minha classe DAOTeste salve o registro.

Erro:

INFO: HHH000037: Columns: [us_login, us_senha, perfil_per_id, us_id, us_situação, us_nome, us_ramal, us_email, us_obsevacao]
Hibernate: select perfil0_.per_id as per_id1_0_, perfil0_.per_descricao as per_desc2_0_ from Perfil perfil0_ where perfil0_.per_id=?

classe usuario.java

package br.com.teste.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

import com.sun.istack.internal.NotNull;

@Entity
@Table(name="Usuario")
@NamedQueries({@NamedQuery(name="Usuario.listar",query="SELECT usuario FROM Usuario usuario"),
@NamedQuery(name="Usuario.buscarPorCodigo",query="SELECT usuario FROM Usuario usuario WHERE usuario.id=:id"),
	
})

public class Usuario {
	
	@Id
	@Column (name="us_id")
	@GeneratedValue(strategy=GenerationType.AUTO)
	
	private Long id;
	
	@Column (name="us_nome" ,length=45,nullable=false)	
	@NotEmpty(message="Informe seu nome!")
	private String nome;
	
	@Column (name="us_email",length=45,nullable=false)
	@NotEmpty(message="Informe seu e-mail!")
	@Email(message="E-mail inválido!")
	private String email;
	
	@Column (name="us_login",length=45,nullable=false)
	@NotEmpty(message="Informe seu login!")
	private String login;
	
	@Column (name="us_senha",length=16,nullable=false)
	@NotEmpty(message="Informe sua senha!")
	private String senha;
	
	@Column (name="us_ramal")	
	@NotEmpty(message="Informe seu ramal!")
	private int ramal;
			
	@Column (name="us_obsevacao",length=45)	
	private String obsevacao;
	
	@Column (name="us_situação",nullable=false)	
	@NotEmpty(message="Informe uma situação!")
	@NotNull
	private Boolean situação;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="Perfil_per_id",referencedColumnName="per_id",nullable=false)
	@NotEmpty
	private Perfil perfil;
	
	
	public Perfil getPerfil() {
		return perfil;
	}
	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public int getRamal() {
		return ramal;
	}
	public void setRamal(int ramal) {
		this.ramal = ramal;
	}
	public String getObsevacao() {
		return obsevacao;
	}
	public void setObsevacao(String obsevacao) {
		this.obsevacao = obsevacao;
	}

	public Boolean getSituação() {
		return situação;
	}
	public void setSituação(Boolean situação) {
		this.situação = situação;
	}
	@Override
	public String toString() {
		return "Usuario [id=" + id + ", nome=" + nome + ", email=" + email + ", login=" + login + ", senha=" + senha
				+ ", ramal=" + ramal + ", obsevacao=" + obsevacao + ", situação=" + situação + ", perfil=" + perfil
				+ "]";
	}
	
	
	
	
	

}

classe usuarioDAO teste (esta comentado pois deu erro sem os comentários ai decidi testar o método de forma isolada)

package br.com.teste.test;

//import java.util.List;

//import org.junit.Ignore;
import org.junit.Test;

import br.com.teste.DAO.PerfilDAO;
import br.com.teste.DAO.UsuarioDAO;
import br.com.teste.domain.Perfil;
import br.com.teste.domain.Usuario;

public class UsuarioDAOTest {

	@Test
	

	public void salvar() throws Exception {

		PerfilDAO dao = new PerfilDAO();
		Perfil p2 = dao.buscarPorCodigo(8L);
		

		Usuario u1 = new Usuario();

		u1.setNome("Adriano");
		u1.setEmail("Adriano@teste.com.br");
		u1.setLogin("adriano");
		u1.setObsevacao("teste1");
		u1.setPerfil(p2);
		u1.setRamal(95619);
		u1.setSenha("456");
		u1.setSituação(true);
	

		UsuarioDAO udao = new UsuarioDAO();

		udao.salvar(u1);
		

	}

//	@Test
//	@Ignore
//	public void listar() {
//		UsuarioDAO dao = new UsuarioDAO();
//		List<Usuario> usuarios = dao.listar();
//
//		for (Usuario usuario : usuarios) {
//
//			System.out.println(usuario);
//
//		}
//
//	}
//	
//	@Test
//	@Ignore
//	
//	
//	public void buscarPorCodigo() {
//
//		UsuarioDAO dao = new UsuarioDAO();
//		Usuario p1 = dao.buscarPorCodigo(6L);
//
//		System.out.println(p1);
//
//	}
//
//	@Test
//	@Ignore
//	public void excluir() throws Exception {
//
//		UsuarioDAO dao = new UsuarioDAO();
//		Usuario usuario = dao.buscarPorCodigo(6L);
//
//		
//			dao.excluir(usuario);
//		
//	}
//	
//	@Test
//	@Ignore
//	public void editar() throws Exception {
//		PerfilDAO dao = new PerfilDAO();
//		Perfil p2 = dao.buscarPorCodigo(9L);
//		
//		UsuarioDAO udao = new UsuarioDAO();
//		Usuario usuario = udao.buscarPorCodigo(4L);
//		
//		usuario.setNome("Arlindo");
//		usuario.setEmail("Arlindo@teste.com.br");
//		usuario.setLogin("arlindo");
//		usuario.setObsevacao("teste10");
//		usuario.setPerfil(p2);
//		usuario.setRamal(95619);
//		usuario.setSenha("123");
//		usuario.setSituação(true);
//		
//			udao.editar(usuario);
//		
//	}
//	
}

classe usuariodao

package br.com.teste.DAO;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.teste.domain.Perfil;
import br.com.teste.domain.Usuario;
import br.com.teste.util.HibernateUtil;

public class UsuarioDAO {

	public void salvar(Usuario usuario) throws Exception {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Transaction transacao = null;// inicia transacao como nula

		try {

			transacao = sessao.beginTransaction();// abrindo a transacao
			sessao.save(usuario);// salva dados do perfil
			transacao.commit();// confirmando transacao

		} catch (RuntimeException ex) {
			if (transacao != null) {
				transacao.rollback();

			}
			throw ex;
		}

		finally {
			sessao.close();
		}

	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listar() {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		List<Usuario> usuarios = null;// inicia transacao como nula

		try {

			Query consulta = sessao.getNamedQuery("Usuario.listar");
			usuarios = consulta.list();

		} catch (RuntimeException ex) {

			throw ex;
		}

		finally {
			sessao.close();
		}

		return usuarios;

	}

	public Usuario buscarPorCodigo(Long id) {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Usuario usuario = null;// inicia transacao como nula

		try {

			Query consulta = sessao.getNamedQuery("Usuario.buscarPorCodigo");
			consulta.setLong("Id", id);
			usuario = (Usuario) consulta.uniqueResult();

		} catch (RuntimeException ex) {

			throw ex;
		}

		finally {
			sessao.close();
		}

		return usuario;

	}

	public void excluir(Usuario usuario) throws Exception {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Transaction transacao = null;// inicia transacao como nula

		try {

			transacao = sessao.beginTransaction();// abrindo a transacao
			sessao.delete(usuario);// salva dados do perfil
			transacao.commit();// confirmando transacao

		} catch (RuntimeException ex) {
			if (transacao != null) {
				transacao.rollback();

			}
			throw ex;
		}

		finally {
			sessao.close();
		}

	}
	
	
	
	public void editar(Perfil perfil) throws Exception {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Transaction transacao = null;// inicia transacao como nula

		try {

			transacao = sessao.beginTransaction();// abrindo a transacao
			
			
			sessao.update(perfil);// salva dados do perfil
			transacao.commit();// confirmando transacao

		} catch (RuntimeException ex) {
			if (transacao != null) {
				transacao.rollback();

			}
			throw ex;
		}

		finally {
			sessao.close();
		}

	}
	
	public void editar(Usuario usuario) throws Exception {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Transaction transacao = null;// inicia transacao como nula

		try {

			transacao = sessao.beginTransaction();// abrindo a transacao
			
			
			sessao.update(usuario);// salva dados do perfil
			transacao.commit();// confirmando transacao

		} catch (RuntimeException ex) {
			if (transacao != null) {
				transacao.rollback();

			}
			throw ex;
		}

		finally {
			sessao.close();
		}

	}



}

****************classe usuárioBean************************

package br.com.teste.Bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;


import br.com.teste.util.JSFUtil;
import br.com.teste.DAO.PerfilDAO;
import br.com.teste.DAO.UsuarioDAO;
import br.com.teste.domain.Perfil;
import br.com.teste.domain.Usuario;

@ManagedBean(name = "MBUsuario")
@ViewScoped
public class UsuarioBean {
	private Usuario usuario;

	 private ArrayList<Usuario>itens;
	 private ArrayList<Usuario>itensFiltrados;
	 private String acao;
	 private Long codigo;
	 private List<Perfil>listaPerfil;
	 
	 
	 public void setListaPerfil(List<Perfil> listaPerfil) {
		this.listaPerfil = listaPerfil;
	}
	 
	 public List<Perfil> getListaPerfil() {
		return listaPerfil;
	}
	 
	 public Long getCodigo() {
		return codigo;
	}
	 
	 
	 public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}
	 
	 
	 public String getAcao() {
		return acao;
	}
	 
	 
	 public void setAcao(String acao) {
		this.acao = acao;
	}
	
	public Usuario getUsuario() {
		
		return usuario;
	}

	//
	public void setProduto(Usuario usuario) {
		this.usuario = usuario;
	}



	 public ArrayList<Usuario> getItens() {
	 return itens;
	 }
	
	 public void setItens(ArrayList<Usuario> itens) {
	 this.itens = itens;
	 }
	
	
	 public ArrayList<Usuario> getItensFiltrados() {
	 return itensFiltrados;
	 }
	
	 public void setItensFiltrados(ArrayList<Usuario> itensFiltrados) {
	 this.itensFiltrados = itensFiltrados;
	 }

	// @PostConstruct
	 public void prepararPesquisa(){
		
	 try {
		 UsuarioDAO fdao = new UsuarioDAO();
	 itens = (ArrayList<Usuario>) fdao.listar();
	
	 } catch (RuntimeException e) {
	 JSFUtil.adicionarMensagemErro("ex.getMessage()");
	 e.printStackTrace();
	 }
	
	 }
	 
	 
	 public void carregarCadastro(){

		 try {
		     
			
			 if(codigo != null){
				
				 
				 UsuarioDAO fdao = new UsuarioDAO();	
			
				 usuario = fdao.buscarPorCodigo(codigo);
				 
			 }
			 else
				 {
				 usuario = new Usuario();
				
			 }
			 
			 PerfilDAO dao = new PerfilDAO();
			 listaPerfil = dao.listar();
		
		 } catch (RuntimeException e) {
		 JSFUtil.adicionarMensagemErro("ex.getMessage()");
		 e.printStackTrace();
		 }
		
		 } 
	 

	 public void novo(){
		 usuario = new Usuario();
	 }

	public void salvar() {

		try {
			UsuarioDAO fdao = new UsuarioDAO();
			fdao.salvar(usuario);
			
			usuario = new Usuario();

			

			JSFUtil.adicionarMensagemSucesso("Produto salvo com sucesso!");

		} catch (Exception e) {
			JSFUtil.adicionarMensagemErro("ex.getMessage()");
			e.printStackTrace();
		}
	}

	
	
	 public void excluir(){
	 try {
		 UsuarioDAO fdao = new UsuarioDAO();
	 fdao.excluir(usuario);
	
	
	
	 JSFUtil.adicionarMensagemSucesso("Produto excluido com sucesso!");
	
	 } catch (Exception e) {
	 JSFUtil.adicionarMensagemErro("ex.getMessage()");
	 e.printStackTrace();
	 }
	 }
	
	
	
	
	
	 public void editar(){
	 try {
		 UsuarioDAO fdao = new UsuarioDAO();
	 fdao.editar(usuario);
	
	
	 JSFUtil.adicionarMensagemSucesso("Produto editado com sucesso!");
	
	 } catch (Exception e) {
	 JSFUtil.adicionarMensagemErro("ex.getMessage()");
	 e.printStackTrace();
	 }
	 }
}

*********** classe perfildao ********************

package br.com.teste.DAO;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.teste.domain.Perfil;
import br.com.teste.util.HibernateUtil;

public class PerfilDAO {

	public void salvar(Perfil perfil) throws Exception {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Transaction transacao = null;// inicia transacao como nula

		try {

			transacao = sessao.beginTransaction();// abrindo a transacao
			sessao.save(perfil);// salva dados do perfil
			transacao.commit();// confirmando transacao

		} catch (RuntimeException ex) {
			if (transacao != null) {
				transacao.rollback();

			}
			throw ex;
		}

		finally {
			sessao.close();
		}

	}

	@SuppressWarnings("unchecked")
	public List<Perfil> listar() {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		List<Perfil> perfis = null;// inicia transacao como nula

		try {

			Query consulta = sessao.getNamedQuery("Perfil.listar");
			perfis = consulta.list();

		} catch (RuntimeException ex) {

			throw ex;
		}

		finally {
			sessao.close();
		}

		return perfis;

	}

	public Perfil buscarPorCodigo(Long id) {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Perfil perfil = null;// inicia transacao como nula

		try {

			Query consulta = sessao.getNamedQuery("Perfil.buscarPorCodigo");
			consulta.setLong("Id", id);
			perfil = (Perfil) consulta.uniqueResult();

		} catch (RuntimeException ex) {

			throw ex;
		}

		finally {
			sessao.close();
		}

		return perfil;

	}

	public void excluir(Perfil perfil) throws Exception {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Transaction transacao = null;// inicia transacao como nula

		try {

			transacao = sessao.beginTransaction();// abrindo a transacao
			sessao.delete(perfil);// salva dados do perfil
			transacao.commit();// confirmando transacao

		} catch (RuntimeException ex) {
			if (transacao != null) {
				transacao.rollback();

			}
			throw ex;
		}

		finally {
			sessao.close();
		}

	}
	
	
	
	public void editar(Perfil perfil) throws Exception {

		Session sessao = HibernateUtil.getSessionFactory().openSession();

		Transaction transacao = null;// inicia transacao como nula

		try {

			transacao = sessao.beginTransaction();// abrindo a transacao
			
			
			sessao.update(perfil);// salva dados do perfil
			transacao.commit();// confirmando transacao

		} catch (RuntimeException ex) {
			if (transacao != null) {
				transacao.rollback();

			}
			throw ex;
		}

		finally {
			sessao.close();
		}

	}


}


*************** configuração hibernate ********************

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- configuracao de Conexao com o babco de dados -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/testepatrimonial</property>
        <property name="connection.username">root</property>
        <property name="connection.password">1234</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- gerenciamento -->
        <property name="current_session_context_class">thread</property>

        <!-- desabilita o cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- exige comandos sql -->
        <property name="show_sql">true</property>

        <!-- criacao das tabelas -->
        <property name="hbm2ddl.auto">update</property>
        <property name="hbm2ddl.auto">validate</property>
       
        
     	<mapping class="br.com.teste.domain.Usuario"/>
       <mapping class="br.com.teste.domain.Perfil"/>
       
       

      
      

    </session-factory>

</hibernate-configuration>

O log que vc colocou é de um select, posta a exception se for o caso

Resolvido pessoal era erro no tipo de dados que estva usando no BD.mudei alguns tipos e funcional.