Hibernate Update[Resolvido]

Galera já rodei hoje o dia todo no google pra tentar resolver esse problema e não consegui já achei alguns tópicos bem parecidos, entretanto nenhuma solução que encontrei
resolveu o problema. O erro ocorre quando tento atualizar um registro do banco de dados que possuí um relacionamento com diversas entidades. Acredito que o erro esteja no relacionamento mas, não consigo resolver. agradeço muito a ajuda.

a entidade que quero atualizar está da seguinte forma.

[code]

@Entity
@Table(name = “instituicao”)
public class Instituicao {

    @Id
private String identificador;

@Column(name = "nome")
private String nome;

@OneToMany(mappedBy = "instituicao", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<Turma> turmas;

@OneToOne
@JoinColumn(name = "idUsuario")
@Cascade(CascadeType.SAVE_UPDATE)
private Coordenador coordenador;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "Instituicao_professor", joinColumns = { @JoinColumn(name = "identificador") }, inverseJoinColumns = { @JoinColumn(name = "cpfMatricula") })
@Cascade(CascadeType.ALL)
private Collection<Professor> professores;

@OneToMany(mappedBy = "instituicao", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
private Collection<Aluno> alunos;

private String telefone;
private String email;
private String estado;
private String cidade;
private String bairro;
private String rua;
private String cep;
private String numero;
private String complemento;
private String dominio;[/code]

e as duas outras entidades que apresentam erro e elas se relacionam segue abaixo

public class Turma {

	@Id
	private String idTurma;

	@Column(name = "nome")
	private String nome;

	@OneToMany(mappedBy = "turma", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Aluno> alunos;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "turma_professor", joinColumns = { @JoinColumn(name = "idTurma") }, 
	inverseJoinColumns = { @JoinColumn(name = "cpfMatricula") })
	private Collection<Professor> professores;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "identificador", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
	private Instituicao instituicao;
@Entity
@Table(name = "Aluno")
public class Aluno extends Usuario {

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idTurma", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	private Turma turma;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "identificador", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.ALL)
	private Instituicao instituicao;

	@OneToMany(mappedBy = "aluno", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Resposta> respostas;[/code]

e o erro é esse aqui ..

[code]5515 [http-8080-2] ERROR org.hibernate.util.JDBCExceptionReporter - Entrada em lote 0 delete from instituicao where identificador='CMT' foi abortada. Chame getNextException para ver a causa.
5515 [http-8080-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23503
5515 [http-8080-2] ERROR org.hibernate.util.JDBCExceptionReporter - ERRO: atualização ou exclusão em "instituicao" viola restrição de chave estrangeira "fk6998f65758dd1ac" em "turma"
  Detalhe: Chave (identificador)=(CMT) ainda é referenciada pela tabela "turma".
5516 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener - 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:71)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:251)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1004)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:342)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:136)
	at br.com.simuladoOnline.persistencia.RepositorioInstituicao.removerInstituicao(RepositorioInstituicao.java:41)
	at br.com.simuladoOnline.negocio.controlador.ControladorInstituicao.removerInstituicao(ControladorInstituicao.java:24)
	at br.com.simuladoOnline.servico.ServicoInstituicao.removerInstituicao(ServicoInstituicao.java:20)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418)
	at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)
	at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400)
	at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005)
	at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103)
	at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)
	at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)
	at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)
	at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166)
	at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291)
	at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	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:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	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:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 delete from instituicao where identificador='CMT' foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2598)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2737)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:244)
	... 38 more
122986 [http-8080-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23503
122986 [http-8080-2] ERROR org.hibernate.util.JDBCExceptionReporter - Entrada em lote 0 delete from instituicao where identificador='CEMA' foi abortada. Chame getNextException para ver a causa.
122986 [http-8080-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23503
122986 [http-8080-2] ERROR org.hibernate.util.JDBCExceptionReporter - ERRO: atualização ou exclusão em "instituicao" viola restrição de chave estrangeira "fk3c6d4cb758dd1ac" em "aluno"
  Detalhe: Chave (identificador)=(CEMA) ainda é referenciada pela tabela "aluno".
122986 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener - 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:71)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:251)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1004)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:342)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:136)
	at br.com.simuladoOnline.persistencia.RepositorioInstituicao.removerInstituicao(RepositorioInstituicao.java:41)
	at br.com.simuladoOnline.negocio.controlador.ControladorInstituicao.removerInstituicao(ControladorInstituicao.java:24)
	at br.com.simuladoOnline.servico.ServicoInstituicao.removerInstituicao(ServicoInstituicao.java:20)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418)
	at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)
	at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400)
	at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005)
	at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103)
	at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)
	at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)
	at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)
	at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166)
	at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291)
	at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	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:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	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:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 delete from instituicao where identificador='CEMA' foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2598)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2737)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:244)
	... 38 more

Bom, me parece que o que você tentou fazer foi um delete, e o hibernate não deixou pois vc tentou deletar alguma tabela com dependencias…

Mais ou menos assim, vc tinha um alino matriculado em uma determinada instituição, e tentou deletar a instituição, isso não pode, pois vc tem um aluno que depende daquela instituição, me parece isso o erro.

Tem que tratar, circundar a instrução de delete com um try/catch e colocar pra imprimir o stack trace

Não tentei deletar cara tentei atualizar o registro fazendo uso desse método aqui.

[code]
public void atualizarInstituicao(String identificador,
Instituicao instituicao) {

	session = CreateSessionFactory.openSession();
	tx = session.beginTransaction();
	session.merge(identificador, instituicao);
	tx.commit();
	session.close();

}[/code]

[quote=vinkello]Não tentei deletar cara tentei atualizar o registro fazendo uso desse método aqui.

[code]
public void atualizarInstituicao(String identificador,
Instituicao instituicao) {

	session = CreateSessionFactory.openSession();
	tx = session.beginTransaction();
	session.merge(identificador, instituicao);
	tx.commit();
	session.close();

}[/code][/quote]

Use somente o

		session.merge(instituicao);

Repare que o hibernate está tentando excluir o registro instituição

       delete from instituicao where identificador='CEMA' f

Observação: Se em caso de exclusão vc necessitar excluir as dependências, use:


 @OneToMany(mappedBy = "turma", fetch = FetchType.LAZY)   
 @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
 private Collection<Aluno> alunos;  
  

Pois somente assim o hibernate excluirá os filhos antes do pai.

Abraços

oi, quando vc faz este merge a lista de turmas esta vazia? o hibernate pode estar entendendo q vc quer excluir turmas. tenta usar o persist no lugar do merge.