bom dia galera, estou iniciando uma aplicação teste aqui na empresa pra começarmos a aplicar hibernate, porém está dando alguns problemas, vou postar a ideia aqui…
a ideia inicial é fazer uma agente onde uma agenda tem varios contatos e varios usuarios.
a navegabilidade é bidirecional entre agenda e usuario(Usuario tem apenas uma agenda), e unidirecional de contato pra agenda(agenda pra contato) ok…
error:
Exception in thread "main" org.hibernate.MappingException: Foreign key (FK9BEFBE0A10E6256:Contato [contato_id])) must have same number of columns as the referenced primary key (Agenda [usuario_id,contato_id])
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:90)
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:73)
at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1263)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1170)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)
at br.inf.bios.util.HibernateUtil.getSession(HibernateUtil.java:17)
at br.inf.bios.persistencia.TesteHibernate.main(TesteHibernate.java:24)
estou usando Xdoclet…os hbms de agenda e sua entida…
Agenda.hbm.xml
<hibernate-mapping package="br.inf.bios.entidade">
<class name="Agenda">
<composite-id name="id" class="AgendaID" >
<key-property name="usuarioid" column="usuario_id" ></key-property>
<key-property name="contatoid" column="contato_id"></key-property>
</composite-id>
<property name="dtinclussao" column="dt_cadastramento" ></property>
<set name="contato" cascade="save-update" lazy="true" >
<key column="contato_id" >
</key>
<one-to-many class="Contato" />
</set>
<set name="usuario" cascade="save-update" lazy="true" >
<key column="usuario_id" ></key>
<one-to-many class="Usuario" />
</set>
</class>
</hibernate-mapping>
Agenda
package br.inf.bios.entidade;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import br.inf.bios.entidadeIF.AgendaIF;
import br.inf.bios.entidadeIF.ContatoIF;
import br.inf.bios.entidadeIF.UsuarioIF;
public class Agenda implements AgendaIF, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Set<UsuarioIF> usuario;
private Set<ContatoIF> contato;
private Date dtinclussao;
public Set<ContatoIF> getContato() {
// TODO Auto-generated method stub
return this.contato;
}
public Date getDatainclusao() {
// TODO Auto-generated method stub
return this.dtinclussao;
}
public Set<UsuarioIF> getUsuario() {
// TODO Auto-generated method stub
return this.usuario;
}
public void setContato(ContatoIF contato) {
// TODO Auto-generated method stub
this.contato.add(contato);
}
public void setDatainclusao(Date dtinclusao) {
// TODO Auto-generated method stub
this.dtinclussao = dtinclusao;
}
public void setUsuario(UsuarioIF usuario) {
// TODO Auto-generated method stub
this.usuario.add(usuario);
}
}
um mainzinho de teste
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction trans = session.beginTransaction();
TelefoneIF telefoneIF = new Telefone();
telefoneIF.setDdd("062");
telefoneIF.setFone("3251-6607");
ContatoIF contatoIF = new Contato();
contatoIF.setEmail("daniel@gmail.com");
contatoIF.setNome("Daniel Souza");
contatoIF.setTelefone(telefoneIF);
UsuarioIF usuarioIF = new Usuario();
usuarioIF.setId(new Integer(1));
AgendaIF agendaIF = new Agenda();
agendaIF.setContato(contatoIF);
agendaIF.setUsuario(usuarioIF);
session.save(agendaIF);
trans.commit();
}
}
seguinte no meu contexto o Objeto ja vai estar na sesson, eu so vou salver em agenda o contato pois o Usuario vai ter de estar logado pra poder inserir um contato…Se alguem puder me dar uma façar, desde já agradeço…