org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): jdo.TelefoneContatos
at org.hibernate.id.Assigned.generate(Assigned.java:33)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
estou tentando salvar um telefoneContato q tem chave composta e ele dá esse erro! alguém ja viu isto?
Você atribuiu a chama ao objeto corretamente? Ela não pode ser gerada automaticamente!
<composite-id name="comp_id" class="hibernate.TelefoneContatoPk">
<meta attribute="field-description" inherit="false">
@hibernate.id
generator-class="assigned"
</meta>
<key-property
name="codigoContato"
column="codigo_contato"
type="java.lang.Integer"
length="4"
>
<meta attribute="field-description">
@hibernate.property
column="codigo_contato"
</meta>
</key-property>
<key-property
name="codigoTelefone"
column="codigo_telefone"
type="java.lang.Integer"
length="4"
>
<meta attribute="field-description">
@hibernate.property
column="codigo_telefone"
</meta>
</key-property>
</composite-id>
como colocar pra ele gerar manualmente a chave composta?
o lance eh q vc tem q setar manualmente os dois IDs antes de chamar o metodo save()
blz, na verdade meu erro estava na classe TelefoneContatoPk, eu não tinha feito os métodos hashCode e equals.
mas eu tenho outra erro agora, estou gravando o meu telefone contato mas na hora de carregar as informações ou seja instanciar passando a chave composta ele não carrega um chave estrangeira q eu tenho tb.
ex:
TelefoneContatos tel = new TelefoneContatos(1,new Contatos(1));
System.out.println(tel.getContato().getNome());
System.out.println(tel.getDdd()+" "+tel.getNumero()+" - "+tel.getTipoTelefone().getNome());
da erro pq retorna null no tipo de telefone (tel.getTipoTelefone() esta trazendo null) sendo q ele foi mapeado como uma chave estrangeira.
alguém sabe como fazer isso funcionar?
vc esta criando uma instancia de TelefoneContato, passando pro construtor uma no Instancia de Contatos…
acredito q tenha coisa estranha com seu mapeamento…a gente teria q dar uma olhada na classe TelefoneContatos e no seu mapeamento…pq aparentemente ao inicializa-la, vc esta criando uma nova instancia de Contatos…isso nao eh necessario se vc fez o mapeamento correto, pq o Hibernate mesmo vai trazer pra vc as classes q tiverem relacionamento com a q vc puxou do banco…
Na verdade eu estava instanciando um TelefoneContato errado, mas fiz um código q deu certo e ele carregou todo o objeto corretamente:
Sessao.getSession().get(Class classe,Serializable ser)
funcionou certinho!
Mas aproveitando, tem algo parecido com isso para uma classe q não é Serializable ? tipo isso aí funcionou acho eu pq passei como parametro TelefoneContato.class e a classe da chave composta q é Serializable new TelefoneContatoPk(int,int), mas gostaria de classes simples tipo Contatos eu fazer algo assim Sessao.getSession().get(“Contatos”,“chave primaria”) ou qualquer coisa parecida, ou seja q eu carregue o objeto só dando um get na sessao!!!
não sei se fui claro! Obrigado!