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