ID COmposto Annotation Hibernate

6 respostas
B

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

@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(){
		
	}
	
}
@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(){
		
	}

Mas o hibernate joga o erro :

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

Meu erro esta no mapeamento !?
Obrigado

Begot

6 Respostas

L

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

@Entity  
@Table(name="gav_sub_classe")
public class Gav_SubClasse implements Serializable{  
  
    private static final long serialVersionUID = -2185038838222198562L;  
  
    @EmbbededId  
    private Gav_SubClassePK  idComposto;  

...
}
B

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

L

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

B

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 !?

B

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

B
Criado 12 de maio de 2009
Ultima resposta 12 de mai. de 2009
Respostas 6
Participantes 2