Pessoal.
Estou criando uma aplicação usando o hibernate.
Minha tabela tem chave composta. Para ela criei uma classe com o nome de Logomarca e outra LogomarcaPk.
Na classe Logomarca, idLogomarca é auto-incremento.
Quando tento inserir algo no banco ele não incrementa automaticamente. O que será que está faltando ?
Estou usando o banco HsqlDB para testes.
Obrigado
@Entity
@IdClass(LogomarcaPk.class) // Classe referente a chave composta
public class Logomarca {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "LGM_LGM_ID")
private long idLogomarca;
@Id
@Column(name = "LGM_LGM_VERSAO")
private int idVersao;
@Column(name = "PRD_PRD_ID", nullable = false)
private int idPrd;
@Column(name = "LGM_LGM_ID_PAI", nullable = true)
private int idLogomarcaPai;
@Column(name = "LGM_LGM_VERSAO_PAI", nullable = true)
private int idVersaoPai;
... getrs e setrs
}
Para esta classe criei uma classe que LogomarcaPk
@Embeddable
public class LogomarcaPk implements Serializable {
@Column(name = "LGM_LGM_ID")
private Long idLogomarca;
@Column(name = "LGM_LGM_VERSAO")
private int idVersao;
... gets e sets
}
Pessoal.
Descobri que o problema é na geração da tabela.
Quando tiro a linha
@IdClass(LogomarcaPk.class) // Classe referente a chave composta
da classe Logomarca a tabela Logomarca é gerada com o campo id auto-incremento.
O que pode estar errado ?
Para a geração uso o código abaixo.
public static void main(String[] args) {
AnnotationConfiguration cfg = new AnnotationConfiguration();
// GERA A TABELA ARQUIVO
cfg.addAnnotatedClass(Arquivo.class);
new SchemaExport(cfg).create(true, true);
// GERA A TABELA LOGOMARCA
cfg.addAnnotatedClass(Logomarca.class);
new SchemaExport(cfg).create(true, true);
// GERA A TABELA TIPOARQUIVO
cfg.addAnnotatedClass(TipoArquivo.class);
new SchemaExport(cfg).create(true, true);
}
No hibernate, nao tem como, AINDA, se usar uma chave composta com uma das chaves sendo auto-increment…
Ou vc usa um, ou usa outra…
Minha soluçao:
Eu crio na minha classe DAO, um getMaxID(), assim eu pego o ultimo id e incremento ele manualmente numa classe de mapeamento de chave composta.
private int getMaxID()
{
Object obj = sessao.createSQLQuery("SELECT MAX(ID) FROM LOGOMARCA").uniqueResult();
if(obj==null)
return 0;
return Integer.parseInt( obj.toString());
}