Erro Hibernate - MappingException

Sou iniciante em Hibernate e estou tendo problemas em mapear com Annotations entidades com relacionamento.

Ao tentar criar uma sessão pelo método getSessionFactory() da classe HibernateUtil é gerado o erro abaixo.
Tentei ver se tinha esquecido de alguma configuração nas anotações das Classes de Entidades mas parece que está certo e procurei alguma coisa relacionada mas não consegui encontrar uma solução.

Alguém tem idéia do que eu estou errando e pode me ajudar ?

org.hibernate.MappingException: Attribute [resgate] refers to unknown entity: [java.util.List]
at org.hibernate.metamodel.source.internal.AssociationResolver.resolve(AssociationResolver.java:57)
at org.hibernate.metamodel.source.internal.AssociationResolver.resolve(AssociationResolver.java:44)
at org.hibernate.metamodel.source.internal.MetadataImpl.(MetadataImpl.java:169)
at org.hibernate.metamodel.source.internal.MetadataBuilderImpl.buildMetadata(MetadataBuilderImpl.java:83)
at org.hibernate.metamodel.MetadataSources.buildMetadata(MetadataSources.java:112)
at br.com.banco.model.dao.util.HibernateUtil.getSessionFactory(HibernateUtil.java:25)
at br.com.banco.model.dao.ClienteDAO.lista(ClienteDAO.java:18)
at teste1.main(teste1.java:10)

Segue as classes e as configurações:

Classe Cliente


package br.com.banco.model;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity(name="cliente")
public class Cliente implements Serializable{
	
	@Id
	@Column(name="id_cliente")
	private int idCliente;
	
	@Column(name="nome_cliente")
	private String nomeCliente;
	
	@OneToMany(mappedBy="cliente")
	private List<Resgate> resgate;
	
	public Cliente(){
		
	}
	
	public int getIdCliente() {
		return idCliente;
	}
	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}
	public String getNomeCliente() {
		return nomeCliente;
	}
	public void setNomeCliente(String nomeCliente) {
		this.nomeCliente = nomeCliente;
	}
	public List<Resgate> getResgate() {
		return resgate;
	}
	public void setResgate(List<Resgate> resgate) {
		this.resgate = resgate;
	}
}

Classe Resgate

package br.com.banco.model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity(name="resgate")
public class Resgate implements Serializable{

	@Id
	@Column(name="id_resgate")
	private int idResgate;
	
	@Column(name="endereco")
	private String endereco;
	
	@ManyToOne
	@JoinColumn(name="id_cliente")
	private Cliente cliente;
	
	public Resgate(){
		
	}
	
	public int getIdResgate() {
		return idResgate;
	}
	public void setIdResgate(int idResgate) {
		this.idResgate = idResgate;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
}

Classe HibernateUtil

package br.com.banco.model.dao.util;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.metamodel.MetadataSources;
import org.hibernate.service.*;
import br.com.banco.model.Cliente;
import br.com.banco.model.Resgate;

public class HibernateUtil {

	private static SessionFactory sf;
	
	public static SessionFactory getSessionFactory(){
		
		if (sf == null){
			try{
				sf = new MetadataSources(
						 new ServiceRegistryBuilder()
						.configure()
						.buildServiceRegistry())
				.addAnnotatedClass(Cliente.class)
				.addAnnotatedClass(Resgate.class)
				.buildMetadata()
				.buildSessionFactory();
			}catch(HibernateException e){
				e.printStackTrace();
				sf = null;
			}
		}
		return sf;
	}
}

Arquivo hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<hibernate-configuration xmlns="http://www.hibernate.org/xsd/hibernate-configuration">
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/relationship</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.connection.pool_size">10</property>
		<property name="show_sql">true</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.current_session_context_class">thread</property>

		<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
		
	</session-factory>
</hibernate-configuration>

Obrigado!

O mapeamento da propriedade @OneToMany está correto, eu retiraria a propriedade name da anotação Entity e tentaria rodar o projeto novamente…

vc precisa anotar na sua classe
alem do @Entity
o @Table(name=“nomeTabela”)

e mapea-la no persistence.xml

  • 1

Está faltando o mapeamento da entidade no hibernate.cfg.xml.

<mapping class="com.bla.bla.suaclasse"/>

Usando annotated class não precisa declarar a classe no XML, ele inclusive faz isso no HibernateUtil.

Tirei o parametro name da @Entity e coloquei o @Table(name=“cliente”) e @Table(name=“resgate”), mesmo assim não rolou.

No caso não coloquei o persistence.xml, preciso colocar obrigatoriamente neste caso ?
Também não quis mapear as classes pelo hibernate.cfg.xml pq quis deixar na classe.

Não sei mais o que seria. Se alguem conseguir me ajudar, testar e conseguir rodar ou me passar um outro projeto para exemplo com o mapeamento pelo Annotations do Hibernate parecido com este eu agradeço.

Segue abaixo todas as classes e arquivos do projeto:

Cliente

package br.com.banco.model;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="cliente")
public class Cliente implements Serializable{
	
	@Id
	@Column(name="id_cliente")
	private int idCliente;
	
	@Column(name="nome_cliente")
	private String nomeCliente;
	
	@OneToMany(mappedBy="cliente")
	private List<Resgate> resgate;
	
	public Cliente(){
		
	}
	
	public int getIdCliente() {
		return idCliente;
	}
	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}
	public String getNomeCliente() {
		return nomeCliente;
	}
	public void setNomeCliente(String nomeCliente) {
		this.nomeCliente = nomeCliente;
	}
	public List<Resgate> getResgate() {
		return resgate;
	}
	public void setResgate(List<Resgate> resgate) {
		this.resgate = resgate;
	}
}

Resgate

package br.com.banco.model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="resgate")
public class Resgate implements Serializable{

	@Id
	@Column(name="id_resgate")
	private int idResgate;
	
	@Column(name="endereco")
	private String endereco;
	
	@ManyToOne
	@JoinColumn(name="id_cliente")
	private Cliente cliente;
	
	public Resgate(){
		
	}
	
	public int getIdResgate() {
		return idResgate;
	}
	public void setIdResgate(int idResgate) {
		this.idResgate = idResgate;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
}

HibernateUtil

package br.com.banco.model.dao.util;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.metamodel.MetadataSources;
import org.hibernate.service.*;

import br.com.banco.model.Cliente;
import br.com.banco.model.Resgate;

public class HibernateUtil {

	private static SessionFactory sf;
	
	public static SessionFactory getSessionFactory(){
		
		if (sf == null){
			try{
				sf = new MetadataSources(
						 new ServiceRegistryBuilder()
						.configure()
						.buildServiceRegistry())
				.addAnnotatedClass(Cliente.class)
				.addAnnotatedClass(Resgate.class)
				.buildMetadata()
				.buildSessionFactory();
			}catch(HibernateException e){
				e.printStackTrace();
				sf = null;
			}
		}
		return sf;
	}
}

ClienteDAO

package br.com.banco.model.dao;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import br.com.banco.model.Cliente;
import br.com.banco.model.dao.util.HibernateUtil;

public class ClienteDAO {

	private Session session;
	private List<Cliente> listaCliente;
	
	public List<Cliente> lista(){
		
		try{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			listaCliente = (ArrayList<Cliente>) session
					.createSQLQuery("select id_cliente,nome_cliente from relationship.cliente")
					.addEntity(Cliente.class)
					.list();
			
			for(Cliente cli : listaCliente){
				cli.setResgate(new ResgateDAO().lista(cli));
			}
			
			return listaCliente;
			
		}catch(HibernateException e){
			e.printStackTrace();
			return null;
		}
	}
}

ResgateDAO

package br.com.banco.model.dao;

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

import org.hibernate.HibernateException;
import org.hibernate.Session;
import br.com.banco.model.Cliente;
import br.com.banco.model.Resgate;
import br.com.banco.model.dao.util.HibernateUtil;

public class ResgateDAO {
	
	private Session session;
	private List<Resgate> listaResgate;
	
	public List<Resgate> lista(Cliente cliente){
		
		try{
			session = HibernateUtil.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			listaResgate = (ArrayList<Resgate>) session
					.createSQLQuery(
							"select id_resagte,endereco from relationship.resgate where id_cliente = :cli")
					.addEntity(Resgate.class)
					.setParameter("cli", cliente.getIdCliente()).list();
			return listaResgate;
		}catch(HibernateException ex){
			ex.printStackTrace();
			return null;
		}
	}	
}

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<hibernate-configuration xmlns="http://www.hibernate.org/xsd/hibernate-configuration">
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/relationship</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.connection.pool_size">10</property>
		<property name="show_sql">true</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.current_session_context_class">thread</property>

		<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
		
	</session-factory>
</hibernate-configuration>

teste1 (main)

import br.com.banco.model.Cliente;
import br.com.banco.model.Resgate;
import br.com.banco.model.dao.ClienteDAO;

public class teste1 {

	public static void main(String[] args) {
		ClienteDAO clienteDAO = new ClienteDAO();
		
		for(Cliente cliente : clienteDAO.lista()){
			System.out.println("------------------------------------------------");
			System.out.println("Id Cliente: "+cliente.getIdCliente());
			System.out.println("Nome Cliente: "+cliente.getNomeCliente());
			
			for(Resgate resgate : cliente.getResgate()){
				System.out.println("Resgate: "+resgate.getIdResgate());
				System.out.println("Endereço: "+resgate.getEndereco());
			}
		}
		System.out.println("------------------------------------------------");
	}
}

Obrigado!

Usa esse HibernateUtil:

[code]
public class HibernateUtil {

public static SessionFactory factory;    
    
static {    
    Configuration cfg = new Configuration();  
    cfg.addAnnotatedClass(Cliente.class);
    cfg.addAnnotatedClass(Resgate.class);
    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();   
    factory = cfg.buildSessionFactory(serviceRegistry );  
}    

  
public static Session getSession(){    
    return factory.openSession();  
}    

}[/code]

e descarte seu hibernate.cfg.xml e crie na pasta fonte (src) e crie o hibernate.properties con esse conteudo:

hibernate.connection.username = root     
hibernate.connection.password = root     
hibernate.connection.url = jdbc:mysql://localhost:3306/relationship 
hibernate.connection.driver_class = com.mysql.jdbc.Driver 
hibernate.dialect = org.hibernate.dialect.MySQLDialect    
hibernate.current_session_context_class = thread    
hibernate.show_sql = true

Foi mal a demora, tava resolvendo uns problemas pessoais e não pude responder.

rof20004, segui seu conselho e deu certo, vlw !

Vlw pessoal pela Ajuda ai!
Flw

perdeu toda a facilidade das anotações;
vc precisa ter a anotação Entity vazia
e a Table com o nome da tabela e mapea-la no hibernate.cfg.
simples assim!

Pelo contrario, ganhou praticidade e agilidade.

blz, a Sun está errada na criação das anotações. :shock:

O filho, voce sabe o que isso significa ? pergunte ao criador do topico se ele retirou as anotacoes, acho que voce precisa de um pouco mais de abrangencia em conhecimento de hibernate, nem tudo se resume a xml.

:idea: