E ae galera, estou com uma dúvida com relação a como persistir os dados no banco utilizando hibernate. Eu tenho seguinte erro:
SEVERE: Entrada em lote 0 insert into public.endereco (fk_estado, rua, numero, bairro, cep, cidade, email, pk_cod_endereco) values (1, Avenida Tijuca, 7777, Santa Fé, 37000150, Porto Seguro, NULL, 0) foi abortada. Chame getNextException para ver a causa.
05/08/2008 08:48:37 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 23505
05/08/2008 08:48:37 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "endereco_pkey"
05/08/2008 08:48:37 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:63)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:181)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
at br.com.sispi.hibernate.dao.GenericDao.salvar(GenericDao.java:28)
at recarga.jsp.EdicaoCadastroGeral.continuarBotao_action(EdicaoCadastroGeral.java:496)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:623)
at org.apache.el.parser.AstValue.invoke(AstValue.java:152)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
at com.sun.rave.web.ui.appbase.faces.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
at javax.faces.component.UICommand.broadcast(UICommand.java:383)
at com.sun.webui.jsf.component.WebuiCommand.broadcast(WebuiCommand.java:160)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:317)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:292)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:249)
at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:462)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at com.sun.faces.extensions.avatar.lifecycle.PartialTraversalLifecycle.execute(PartialTraversalLifecycle.java:94)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:674)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into public.endereco (fk_estado, rua, numero, bairro, cep, cidade, email, pk_cod_endereco) values (1, Avenida Tijuca, 7777, Santa Fé, 37000150, Porto Seguro, NULL, 0) foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
Minhas classes estão da seguinte forma:
public class Pessoa implements java.io.Serializable {
private int pkPessoa;
private Endereco endereco;
private String nome;
private String rg;
private String cpf;
private String email;
private Set pessoaTelefones = new HashSet(0);
private Set usuarioSistemas = new HashSet(0);
private Set contatos = new HashSet(0);
public Pessoa() {
}
public Pessoa(int pkPessoa, String nome, String rg, String cpf) {
this.pkPessoa = pkPessoa;
this.nome = nome;
this.rg = rg;
this.cpf = cpf;
}
public Pessoa(int pkPessoa, Endereco endereco, String nome, String rg,
String cpf, String email, Set pessoaTelefones, Set usuarioSistemas,
Set contatos) {
this.pkPessoa = pkPessoa;
this.endereco = endereco;
this.nome = nome;
this.rg = rg;
this.cpf = cpf;
this.email = email;
this.pessoaTelefones = pessoaTelefones;
this.usuarioSistemas = usuarioSistemas;
this.contatos = contatos;
}
public int getPkPessoa() {
return this.pkPessoa;
}
getters and setters
}
public class Endereco implements java.io.Serializable {
private int pkCodEndereco;
private Estado estado;
private String rua;
private int numero;
private String bairro;
private String cep;
private String cidade;
private String email;
private Set pessoas = new HashSet(0);
private Set empresaTelefones = new HashSet(0);
private Set endEmpresas = new HashSet(0);
public Endereco() {
}
public Endereco(int pkCodEndereco, Estado estado, String rua, int numero,
String bairro, String cep, String cidade) {
this.pkCodEndereco = pkCodEndereco;
this.estado = estado;
this.rua = rua;
this.numero = numero;
this.bairro = bairro;
this.cep = cep;
this.cidade = cidade;
}
public Endereco(int pkCodEndereco, Estado estado, String rua, int numero,
String bairro, String cep, String cidade, String email,
Set pessoas, Set empresaTelefones, Set endEmpresas) {
this.pkCodEndereco = pkCodEndereco;
this.estado = estado;
this.rua = rua;
this.numero = numero;
this.bairro = bairro;
this.cep = cep;
this.cidade = cidade;
this.email = email;
this.pessoas = pessoas;
this.empresaTelefones = empresaTelefones;
this.endEmpresas = endEmpresas;
}
getters and setters
}
public class UsuarioSistema implements java.io.Serializable {
private int pkUsuarioSistema;
private TipoUsuario tipoUsuario;
private Pessoa pessoa;
private Empresa empresa;
private String usuario;
private String senha;
private String PSecreta;
private String RSecreta;
public UsuarioSistema() {
}
getters and setters
Criei um Dao Generico para realizar um crud e um outro implementando cada classe nesse formato:
public abstract class GenericDao {
public Session session=null;
public SessionFactory sessionFactory=null;
public SessionFactory getFactory(){
this.sessionFactory = HibernateUtil.getSessionFactory();
return this.sessionFactory;
}
public void salvar(Object classe)throws Exception{
this.session = getFactory().openSession();
this.session.save(classe);
this.session.flush();
this.session.close();
}
public void atualizar(Object classe)throws Exception{
this.session = getFactory().openSession();
this.session.update(classe);
this.session.flush();
this.session.close();
}
public void excluir(Object classe)throws Exception{
this.session = getFactory().openSession();
this.session.delete(classe);
this.session.flush();
this.session.close();
}
}
Porém minha grande duvida é como persistir os dados, visto que como mostrado acima, existem classes que possuem objetos como atributos. o que devo fazer antes, preencher estes objetos e dar um unico save no objeto que contempla os demais? Ou ir dando save em cada um deles??? o que eu fiz foi o seguinte:
Preencho set Telefone e adicionei no objeto Endereco, logo em seguida preenchi o Objeto Pessoa e atribui o Objeto Endereco a mesma, por último preenchi o objeto Usuario e atribui o objeto Pessoa ao mesmo e dei save no objeto usuario, porém aparece o erro citado acima...
Utilizei hibernate tool integrado ao eclipse para gerar os xml de mapeamento, sendo que diversos objetos possuem relação One-to-many e many-to-one.
Se alguem tiver alguma idéia para ajudar, eu agradeço!!!
Abraço a todos!!!