Problemas com atualizar no relacionamento ManyToMany [Resolvido]

Galera eu tenho um relacionamento de n pra n com colunas extras numa terceira tabela de relacionamento estou inserindo as duas entidade que constituem esse relacionamento no banco e só quando tenho as duas tento fazer o relacionamento entretanto o hibernate vêm me lançando esse erro. Agradeço a ajuda galera to doido aqui tentando resolver isso e não consigo.

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Abaixo segue meu mapeamento para as entidades e meu método que atualiza o relacionamento entre as entidades.

Entidade operadora.

[code]
@Entity
@Table(name = “operadora”)
public class Operadora {

@Id
@Column(name = "idoperadora")
private String idOperadora;

@Column(length = 20)
@NotNull
private String descricao;

@OneToMany(mappedBy = "operadora", cascade = CascadeType.ALL)
private Collection<Mensagem> listaMensagens;

@NotNull
private boolean ativo;


@OneToMany(fetch = FetchType.LAZY, mappedBy = "operadora", cascade = {
CascadeType.PERSIST, CascadeType.MERGE })
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private Collection<OperadoraRota> listaOperadoraRotas;

}[/code]

Entidade Rota

[code]

@Entity
@Table(name = “rota”)
public class Rota {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="idRota")
private long idRota;

@Column(length = 50)
@NotNull
private String descricao;

@Column(length = 20)
@NotNull
private String login;

@Column(length = 20)
@NotNull
private String senha;

@Column(length = 50)
@NotNull
private String endereco;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "rota", cascade = {
CascadeType.PERSIST, CascadeType.MERGE })
@Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private Collection<OperadoraRota> listaOperadoraRotas;

}[/code]

Entidade intermediária que relaciona as duas entidades.


@Entity
@Table(name="operadorarota")
public class OperadoraRota {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="idOperadoraRota")
	private long idOperadoraRota;
	
	@ManyToOne
	@JoinColumn(name="idrota")
	private Rota rota;

	@ManyToOne
	@JoinColumn(name="idoperadora")
	private Operadora operadora;

	@Column
	private double tarifaUnidade;

	@Column
	private boolean rotaPadrao;

Método Update que atualiza o relacionamento entre as duas entidades (lembrando as mesmas já estão no banco de dados o que eu faço é relacionar uma com a outra e pronto)


public void atualizarOperadora(String idOperadora, Operadora operadora) {
		
		operadora.setIdOperadora(idOperadora);

		session = CreationSessionFactory.openSession();
		tx = session.beginTransaction();
		session.update(operadora);
		tx.commit();
		session.close();
		
		
	}

Nem um try/catch no método para atualizar? Se algo der errado, no final do processamento, não tem rollback?

Bom, o erro diz que o hibernate não recebeu nenhuma linha para atualizar, quando o esperado era ao menos 1.

Coloca todo o stacktrace, para tentarmos identificar se o erro é apenas este mesmo.

Coloquei um Try/ catch e o que ele mostrou foi isso. Eu insiro uma operadora e uma rota sem relação e depois eu atualizo a entidade operadora como vc pode vêr passando dentro desse objeto operadora uma lista de rotas.

 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
	at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:244)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
	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.clickEnvie.persistencia.RepositorioOperadora.atualizarOperadora(RepositorioOperadora.java:39)
	at br.com.clickEnvie.negocio.controlador.ControladorOperadora.atualizarOperadora(ControladorOperadora.java:30)
	at br.com.clickEnvie.servico.ServicoOperadora.atualizarOperadora(ServicoOperadora.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)
9722 [http-8080-4] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
	at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:244)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
	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.clickEnvie.persistencia.RepositorioOperadora.atualizarOperadora(RepositorioOperadora.java:39)
	at br.com.clickEnvie.negocio.controlador.ControladorOperadora.atualizarOperadora(ControladorOperadora.java:30)
	at br.com.clickEnvie.servico.ServicoOperadora.atualizarOperadora(ServicoOperadora.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)
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
	at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:244)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
	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.clickEnvie.persistencia.RepositorioOperadora.atualizarOperadora(RepositorioOperadora.java:39)
	at br.com.clickEnvie.negocio.controlador.ControladorOperadora.atualizarOperadora(ControladorOperadora.java:30)
	at br.com.clickEnvie.servico.ServicoOperadora.atualizarOperadora(ServicoOperadora.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)

Por que operadora não tem um id marcado com @GeneratedValue?

Veja que você envia um comando de atualização, mas, provavelmente, o hibernate se perca ao tentar encontrar o id da operadora.

É ele tava nulo e eu alterei pra uma chave que eu gero na aplicação mas, consegui resolver ele agora insere o registro na tabela de relacionamento mais o idOperadora vêm vazio na tabela de relacionamento.

Bom, o hibernate tem um comportamento bem específico quanto a save ou update (isolados ou no método saveOrUpdate).

Considerando o método saveOrUpdate, presente na interface Session:

Ao identificar uma entidade cujo atributo indicado como id seja null, ele tentará salvar o mesmo.
Caso o elemento possua um id presente no banco de dados. o hibernate realiza o update.
Caso exista o id na entidade, mas não esteja mapeado no banco, ele também irá realizar o save.

Agora, você passou uma entidade sem id (ou id nulo). Sendo assim, a query criada seria algo como

UPDATE tabela_que_contem_a_operadora
SET colunas = valores
WHERE
coluna_do_id = null;

Como não existe registro com id igual a null…

Ocorre a exception.