ERRO: Property of @IdClass not found no Mapeamento

Olá boa tarde galera,

estou com o seguinte problema:

Tenho uma classe Usuario que é @OneToMany para uma outra chamada Acesso e tenho uma outra chamada Perfil que também é @OneToMany para Acesso. Já na classe Acesso tenho um @ManyToOne para Usuario e @ManyToOne para Perfil.

Ao executar da o seguinte erro: org.hibernate.AnnotationException: Property of @IdClass not found in entity com.model.Acesso: idperfil

AcessoPK:

package com.model;

public class AcessoPK {

	private int idperfil;
	private int idusuario;
	
	public AcessoPK(){
		
	}

	public int getIdPerfil() {
		return idperfil;
	}

	public void setIdPerfil(int idPerfil) {
		this.idperfil = idPerfil;
	}

	public int getIdusuario() {
		return idusuario;
	}

	public void setIdusuario(int idusuario) {
		this.idusuario = idusuario;
	}
	
}

Acesso:

package com.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "ACESSO")
@IdClass(value=AcessoPK.class)
public class Acesso {
	
	@Id
	@ManyToOne
	@JoinColumn(name="idusuario", referencedColumnName="idusuario")
	private Usuario usuario;
	
	@Id
	@ManyToOne
	@JoinColumn(name="idperfil", referencedColumnName="idperfil")
	private Perfil perfil;
	
	
	private String login;	
	private String senha;
	
	


	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;
	}
	
	
}

Perfil:

package com.model;

import java.sql.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "PERFIL")
@SequenceGenerator(name="seq_perfil_id", sequenceName="seq_perfil_id", allocationSize=1)
public class Perfil {
	
	@Id
	@GeneratedValue(generator="seq_perfil_id", strategy=GenerationType.SEQUENCE)
	private int idperfil;
	
	private String nome;	
	
	@OneToMany(mappedBy="perfil")
	private List<Acesso> listaAcessos;
	
	public int getIdperfil() {
		return idperfil;
	}

	public void setIdperfil(int idperfil) {
		this.idperfil = idperfil;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Override
	public int hashCode() {
		return getIdperfil();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Perfil){
			Perfil user = (Perfil) obj;
			return user.getIdperfil() == getIdperfil();
		}
		
		return false;
	}
	
}

Usuario:

package com.model;

import java.sql.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "USUARIO")
@NamedQuery(name="User.findUserByEmail", query="select u from Usuario u where u.email = :email")
@SequenceGenerator(name="seq_usuario_id", sequenceName="seq_usuario_id", allocationSize=1)
public class Usuario {
	
	private static final long serialVersionUID = -8121617132071401241L;
	public static final String FIND_BY_EMAIL = "User.findUserByEmail";
	
	@Id
	@GeneratedValue(generator="seq_usuario_id", strategy=GenerationType.SEQUENCE)
	private int idusuario;
	
	@Column(unique = true)
	private String email;
	private String senha;
	private String nome;	
	private String sobrenome;
	private String cpf;
	private String rg;
	private String orgaoexpedidor;
	private String foto;
	private char sexo;
	private String estadocivil;
	private Date datanascimento;
	private String telefone;
	private String celular;
	private char ativo;
	
	private String role;
	
	@ManyToOne
	@JoinColumn(name="idendereco", referencedColumnName="idendereco")
	private Endereco endereco;
	
	
	@ManyToMany  
    @JoinTable(  
        name="usuarioclinica",  
        joinColumns=@JoinColumn(name="idusuario"),  
        inverseJoinColumns=@JoinColumn(name="idclinica")  
    )  
    private Set<Clinica> clinicas; 
	
	@OneToMany(mappedBy="usuario")
	private List<Acesso> listaAcessos;
	
	
	
	public int getIdusuario() {
		return idusuario;
	}

	public void setIdusuario(int idusuario) {
		this.idusuario = idusuario;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	public String getOrgaoexpedidor() {
		return orgaoexpedidor;
	}

	public void setOrgaoexpedidor(String orgaoexpedidor) {
		this.orgaoexpedidor = orgaoexpedidor;
	}

	public String getFoto() {
		return foto;
	}

	public void setFoto(String foto) {
		this.foto = foto;
	}

	public char getSexo() {
		return sexo;
	}

	public void setSexo(char sexo) {
		this.sexo = sexo;
	}

	public String getEstadocivil() {
		return estadocivil;
	}

	public void setEstadocivil(String estadocivil) {
		this.estadocivil = estadocivil;
	}

	public Date getDatanascimento() {
		return datanascimento;
	}

	public void setDatanascimento(Date datanascimento) {
		this.datanascimento = datanascimento;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public char getAtivo() {
		return ativo;
	}

	public void setAtivo(char ativo) {
		this.ativo = ativo;
	}

	@Override
	public int hashCode() {
		return getIdusuario();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Usuario){
			Usuario user = (Usuario) obj;
			return user.getEmail().equals(getEmail());
		}
		
		return false;
	}
	
}

Não baixei nada, mas vou chutar.

Sua classe tem uma chave composta (mais de um atributo anotado com @Id), porém ela não está anotada com @IdClass, correto ?

Tá sim, o que você acha que pode ser?

Desde já sou muito grato pela ajuda.

Exatamente isso, se você vai ter uma chave composta, precisa mapear isso também, através da anotação @IdClass, ou @EmbeddedId. As duas formas são possíveis.

A ideia do @IdClass é você identificar uma classe que possui somente os atributos da sua PK, e aí tem algo como[code]@Entity
@Table
@IdClass(FuncionarioId.class)
public class Funcionario{

@Id
private long id;

@Id
private long setor;

// resto da sua classe

}[/code]

Brother,

não entendi?

Eu coloquei isso na minha classe Acesso. Eu fiz alguma coisa errada?

Não sei. Se não funcionou provavelmente sim.

você pode dar uma lida em como mapear chaves compostas com JPA, é chato, e a própria documentação diz para não utilizar chaves compostas, mas se for necessário, não é difícil de fazer.

Se quiser poste suas classes aí como ficaram agora, e por favor use as tags [ code][/code] para postar código.

Ficaram assim:

AcessoPK:

package com.model;

public class AcessoPK {

	private int idperfil;
	private int idusuario;
	
	public AcessoPK(){
		
	}

	public int getIdPerfil() {
		return idperfil;
	}

	public void setIdPerfil(int idPerfil) {
		this.idperfil = idPerfil;
	}

	public int getIdusuario() {
		return idusuario;
	}

	public void setIdusuario(int idusuario) {
		this.idusuario = idusuario;
	}
	
}

Acesso:

package com.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "ACESSO")
@IdClass(value=AcessoPK.class)
public class Acesso {
	
	@Id
	@ManyToOne
	@JoinColumn(name="idusuario", referencedColumnName="idusuario")
	private Usuario usuario;
	
	@Id
	@ManyToOne
	@JoinColumn(name="idperfil", referencedColumnName="idperfil")
	private Perfil perfil;
	
	
	private String login;	
	private String senha;
	
	


	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;
	}
	
	
}

Perfil:

package com.model;

import java.sql.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "PERFIL")
@SequenceGenerator(name="seq_perfil_id", sequenceName="seq_perfil_id", allocationSize=1)
public class Perfil {
	
	@Id
	@GeneratedValue(generator="seq_perfil_id", strategy=GenerationType.SEQUENCE)
	private int idperfil;
	
	private String nome;	
	
	@OneToMany(mappedBy="perfil")
	private List<Acesso> listaAcessos;
	
	public int getIdperfil() {
		return idperfil;
	}

	public void setIdperfil(int idperfil) {
		this.idperfil = idperfil;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Override
	public int hashCode() {
		return getIdperfil();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Perfil){
			Perfil user = (Perfil) obj;
			return user.getIdperfil() == getIdperfil();
		}
		
		return false;
	}
	
}

Usuario:

package com.model;

import java.sql.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "USUARIO")
@NamedQuery(name="User.findUserByEmail", query="select u from Usuario u where u.email = :email")
@SequenceGenerator(name="seq_usuario_id", sequenceName="seq_usuario_id", allocationSize=1)
public class Usuario {
	
	private static final long serialVersionUID = -8121617132071401241L;
	public static final String FIND_BY_EMAIL = "User.findUserByEmail";
	
	@Id
	@GeneratedValue(generator="seq_usuario_id", strategy=GenerationType.SEQUENCE)
	private int idusuario;
	
	@Column(unique = true)
	private String email;
	private String senha;
	private String nome;	
	private String sobrenome;
	private String cpf;
	private String rg;
	private String orgaoexpedidor;
	private String foto;
	private char sexo;
	private String estadocivil;
	private Date datanascimento;
	private String telefone;
	private String celular;
	private char ativo;
	
	private String role;
	
	@ManyToOne
	@JoinColumn(name="idendereco", referencedColumnName="idendereco")
	private Endereco endereco;
	
	
	@ManyToMany  
    @JoinTable(  
        name="usuarioclinica",  
        joinColumns=@JoinColumn(name="idusuario"),  
        inverseJoinColumns=@JoinColumn(name="idclinica")  
    )  
    private Set<Clinica> clinicas; 
	
	@OneToMany(mappedBy="usuario")
	private List<Acesso> listaAcessos;
	
	
	
	public int getIdusuario() {
		return idusuario;
	}

	public void setIdusuario(int idusuario) {
		this.idusuario = idusuario;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	public String getOrgaoexpedidor() {
		return orgaoexpedidor;
	}

	public void setOrgaoexpedidor(String orgaoexpedidor) {
		this.orgaoexpedidor = orgaoexpedidor;
	}

	public String getFoto() {
		return foto;
	}

	public void setFoto(String foto) {
		this.foto = foto;
	}

	public char getSexo() {
		return sexo;
	}

	public void setSexo(char sexo) {
		this.sexo = sexo;
	}

	public String getEstadocivil() {
		return estadocivil;
	}

	public void setEstadocivil(String estadocivil) {
		this.estadocivil = estadocivil;
	}

	public Date getDatanascimento() {
		return datanascimento;
	}

	public void setDatanascimento(Date datanascimento) {
		this.datanascimento = datanascimento;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public char getAtivo() {
		return ativo;
	}

	public void setAtivo(char ativo) {
		this.ativo = ativo;
	}

	@Override
	public int hashCode() {
		return getIdusuario();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Usuario){
			Usuario user = (Usuario) obj;
			return user.getEmail().equals(getEmail());
		}
		
		return false;
	}
	
}

E qual problema ocorre?

Dá o seguinte erro:

Caused by: org.hibernate.AnnotationException: Property of @IdClass not found in entity com.model.Acesso: idperfil
	at org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:2336)
	at org.hibernate.cfg.AnnotationBinder.bindIdClass(AnnotationBinder.java:2449)
	at org.hibernate.cfg.AnnotationBinder.mapAsIdClass(AnnotationBinder.java:839)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:667)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3383)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3337)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1321)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1711)
	at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:899)

ah sim, sua classe PK tem que ter os objetos com os mapeamentos, não só o id dos objetos, tem que ser igual está na classe Acesso.

Brother,

alterei a classe AcessoPK:

package com.model;

import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

public class AcessoPK {

	private int idperfil;
	private int idusuario;
	
	public AcessoPK(){
		
	}

	
	@ManyToOne
	@JoinColumn(name="idusuario", referencedColumnName="idusuario")
	private Usuario usuario;
	
	
	@ManyToOne
	@JoinColumn(name="idperfil", referencedColumnName="idperfil")
	private Perfil perfil;
	
	
	public int getIdperfil() {
		return idperfil;
	}

	public void setIdperfil(int idperfil) {
		this.idperfil = idperfil;
	}

	public Usuario getUsuario() {
		return usuario;
	}

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

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public int getIdPerfil() {
		return idperfil;
	}

	public void setIdPerfil(int idPerfil) {
		this.idperfil = idPerfil;
	}

	public int getIdusuario() {
		return idusuario;
	}

	public void setIdusuario(int idusuario) {
		this.idusuario = idusuario;
	}
	
}

E deu o seguinte Erro:

Caused by: org.hibernate.AnnotationException: Unable to find properties (idusuario, idperfil) in entity annotated with @IdClass:com.model.Acesso
	at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:780)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:682)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3383)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3337)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1321)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1711)
	at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:76)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:899)

cara, os atributos tem que ter o mesmo nome, eles tem que ser idênticos

resumindo, copie os mapeamentos da classe Acesso e cole na PK

Brother,

a saideira…rsrs… funcionou… apenas tive q add implements Serializable na classe AcessoPK. Porque? Já que nas minhas Entitys não tem.

Muito obrigado pelo força…