ID COmposto Annotation Hibernate

Olá,

Estou com um problema no meu codigo , preciso usar Id composto e após algumas pesquisas encontrei modos de implementar e ficou assim minhas classes

[code]@Entity
@Table(name=“gav_sub_classe”)
@IdClass(Gav_SubClassePK.class)
public class Gav_SubClasse implements Serializable{

private static final long serialVersionUID = -2185038838222198562L;

@Id
@Column(name="id_sub_classe")
private int id;

@Id
@Column(name="ID_CLASSE")
private int idClasse;

@Column(name="dsc_sub_classe")
private String descricao;

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public int getIdClasse() {
	return idClasse;
}

public void setIdClasse(int idClasse) {
	this.idClasse = idClasse;
}

public boolean equals(Gav_SubClasse sub){
	if(this.getClass().equals(sub.getClass())){
		return true;
	}else return false;
}

public void hascode(){
	
}

}[/code]

[code]@Embeddable
public class Gav_SubClassePK implements Serializable{

private static final long serialVersionUID = -1951001184449482686L;

private int id;

private int idClasse;

public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

public int getIdClasse() {
	return idClasse;
}

public void setIdClasse(int idClasse) {
	this.idClasse = idClasse;
}	

public Gav_SubClassePK(){
	
}

public boolean equals(Gav_SubClassePK subPK){
	if(this.getClass().equals(subPK.getClass())){
		return true;
	}else return false;
}

public void hascode(){
	
}[/code]

Mas o hibernate joga o erro :

[code]org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2216)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
at br.com.simova.bob.model.simova.BoletimModel.getBoletinsAberto(BoletimModel.java:325)
at br.com.simova.bob.model.simova.StatusFrotaModel.setStatusApontamento(StatusFrotaModel.java:124)
at br.com.simova.bob.quartz.VerificaStatusApontamento.execute(VerificaStatusApontamento.java:13)
at org.quartz.core.JobRunShell.run(JobRunShell.java:191)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:516)
Caused by: java.sql.SQLException: ORA-00904: “GAV_SUBCLA19_”.“IDCLASSE”: identificador inválido

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2213)
... 10 more

[/code]

Meu erro esta no mapeamento !?
Obrigado

Begot

Esse nomezinho das classes q vc escolheu fica dificl de entedner o.O

mas c vc tem 1 PK composta… vc deve referenciar ela assim

[code]
@Entity
@Table(name=“gav_sub_classe”)
public class Gav_SubClasse implements Serializable{

private static final long serialVersionUID = -2185038838222198562L;  

@EmbbededId  
private Gav_SubClassePK  idComposto;  


}[/code]

Não tenho culpa dos nomes , as tabelas vao vir do cliente , nao tenho como mudar =/

Bom entao ficaria assim !?

@Entity
@Table(name="gav_sub_classe")
@IdClass(Gav_SubClassePK.class)
public class Gav_SubClasse implements Serializable{

	private static final long serialVersionUID = -2185038838222198562L;

	@Id
	@Column(name="id_sub_classe")
	private int id;

       @EmbbededId    
       private Gav_SubClassePK idClasse;  
	
	
	@Column(name="ID_CLASSE")
	private int idClasse;
	
	@Column(name="dsc_sub_classe")
	private String descricao;
	
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getIdClasse() {
		return idClasse;
	}

	public void setIdClasse(int idClasse) {
		this.idClasse = idClasse;
	}
	
	public boolean equals(Gav_SubClasse sub){
		if(this.getClass().equals(sub.getClass())){
			return true;
		}else return false;
	}
	
	public void hascode(){
		
	}
	
}

e a Gav_SubClassePK ficaria como !?

nao entendi muito bem. Vou testar aqui

Obrigado

Logico q vc tem culpa do nome… heheh … de onde vem a tabela é indefernte… vc mapea a classe com nomes legiveis, e assim, identifica as coias mais facilmente sem ter q ficar decifrando… é pra isso que existe a anotação @Column(nome=“nome_do_campo”) … o nome da propriedade private vc pode scolher a que quiser…

E isso inclui o nome da Entidade… uma entidade de nome Gav_SubClasse não é nem um pouco legivel

e respondendo… não não fica como vc colocou… se vc tem um @EmbbededId então vc ja tem o ID da sua classe que é no caso um achave composta, por um objeto Emmbbedable, sendo assim esse é o seu ID… e não existe o @Id que vc ta colocando na linha de cima…

cada Entidade só pode ter 1 id, sendo ele embedable ou n … e tira akela notação de @IdClass

Bom revendo denovo aqui cheguei acho q ao codigo correto

mas estou com duvida de como acessar o id da classe e qual parametro passar qunado quiser fazer um relacionamento

o codigo ficou assim

package br.com.simova.bob.domain.vo.gatec;

import java.io.Serializable;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.IdClass;
import javax.persistence.Table;


/**
 * @author Felipe Begot
 * @since 1.0.0
 */
@Entity
@Table(name="gav_sub_classe")
public class Gav_SubClasse implements Serializable{

	private static final long serialVersionUID = -2185038838222198562L;

	
	@EmbeddedId
	@AttributeOverrides( { @AttributeOverride(name = "id_classe", column =  
	@Column(name = "id_classe",updatable=false,insertable=false)), @AttributeOverride(name =  
	"id_sub_classe", column = @Column(name = "id_sub_classe", updatable=false,insertable=false)) })
	private Gav_SubClassePK idComposto;

	
	@Column(name="dsc_sub_classe", updatable = false, insertable = false)
	private String descricao;
	
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

//	public int getId() {
//		return id;
//	}
//
//	public void setId(int id) {
//		this.id = id;
//	}
//
//	public int getIdClasse() {
//		return idClasse;
//	}
//
//	public void setIdClasse(int idClasse) {
//		this.idClasse = idClasse;
//	}
	
	public boolean equals(Gav_SubClasse sub){
		if(this.getClass().equals(sub.getClass())){
			return true;
		}else return false;
	}
	
	public void hascode(){
		
	}

	public Gav_SubClassePK getIdComposto() {
		return idComposto;
	}

	public void setIdComposto(Gav_SubClassePK idComposto) {
		this.idComposto = idComposto;
	}
	
	@Embeddable
	public static class Gav_SubClassePK  implements Serializable{

		
		private static final long serialVersionUID = -7934054642061150445L;

		@Column(name="id_sub_classe")
		private int id;
		
		@Column(name="id_classe")
		private int idClasse;

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}

		public int getIdClasse() {
			return idClasse;
		}

		public void setIdClasse(int idClasse) {
			this.idClasse = idClasse;
		}	

		
		@Override
		public boolean equals(Object subPK){
			if(this.getClass().equals(subPK.getClass())){
				return true;
			}else return false;
		}
		
		@Override
		public int hashCode(){
			return 0;
		}

	}
	
}

Obtive o erro :

-12/05/2009 13:42:04 ORA-00904: "FROTA1_"."ID_SUBCLASSE": identificador inválido

org.hibernate.exception.SQLGrammarException: could not execute query
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.loader.Loader.doList(Loader.java:2216)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at br.com.simova.bob.model.simova.BoletimModel.getBoletinsAberto(BoletimModel.java:325)
	at br.com.simova.bob.model.simova.StatusFrotaModel.setStatusApontamento(StatusFrotaModel.java:124)
	at br.com.simova.bob.quartz.VerificaStatusApontamento.execute(VerificaStatusApontamento.java:13)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:191)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:516)
Caused by: java.sql.SQLException: ORA-00904: "FROTA1_"."ID_SUBCLASSE": identificador inválido

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799)
	at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038)
	at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
	at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
	at org.hibernate.loader.Loader.doQuery(Loader.java:674)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2213)
	... 10 more

mas acredito q é pelo relacionamento q estou fazendo com ela

entao fica essa duvida acessar o id composto !?

Bom meu codigo estava certo mesmo aquele foi so um erro na hora de mapear eu estava passando um nome errado.

Muito obrigado pela ajuda

Begot