[RESOLVIDO]Merge não efetua Update somente Insert

Bom galera, estou com um problema ao tentar utilizar o Merge do EntityManager, ao invés dele me atualizar o Objeto esta me Inserindo um novo, não sei o que eu faço pra resolver isso …

[code]
public void atualizatreino(TreinoGeral tg, List de){

this.entityManager.merge(tg);
this.entityManager.flush();

for (DadosExercicio dados: de){

	this.entityManager.merge(dados);
	this.entityManager.flush();
}

}[/code]
Porém o Merge de “dados” é atualizado e o Merde de “tg” é Inserido um novo …

essas classes nao possuem composição uma da outra? pode ser por isso!

“Dados” possui uma chave estrangeira de “TG”, mas o que isso teria a ver ?

quando vc der o merge no Dados a sua composição deveria dar merge tambem. eh preciso um merge soh!

Só lembrando que o Merge é um Update/Insert praticamente como o REPLACE INTO do MySQL, caso seja passado um Id > 0 ou Id != nulo e > 0 ou Id != “vazio” e > 0 um update é efetuado, caso contrário um Insert é efetuado.

Verifique isto no seu debug.

t+ e boa sorte.

[quote=Diego Adriano]Bom galera, estou com um problema ao tentar utilizar o Merge do EntityManager, ao invés dele me atualizar o Objeto esta me Inserindo um novo, não sei o que eu faço pra resolver isso …

[code]
public void atualizatreino(TreinoGeral tg, List<DadosExercicio> de){

this.entityManager.merge(tg);
this.entityManager.flush();

for (DadosExercicio dados: de){

	this.entityManager.merge(dados);
	this.entityManager.flush();
}

}[/code]
Porém o Merge de “dados” é atualizado e o Merde de “tg” é Inserido um novo …[/quote]

isso vai depender, o comportamento do merge é de atualizar sua entidade “se” o atributo anotado com @Id estiver preenchido (com um valor que exista na base… obvio). Te aconselho debugar e olhar isso ou pelo menos dar uns system.out ai pra testar isso.

só é dado o merge em um em decorrência de ter o merge no outro caso na declaração do relacionamento tenha a informação do cascade, caso contrário isso não acontece.

por exemplo, quando for dado o merge na variável tg, somente será dado o merge no(s) DadosExercicio caso a anotação de relacionamento desse atributo na classe TreinoGeral tenha la o CascadeType.MERGE ou o CascadeType.ALL.

[quote=maior_abandonado][quote=Diego Adriano]Bom galera, estou com um problema ao tentar utilizar o Merge do EntityManager, ao invés dele me atualizar o Objeto esta me Inserindo um novo, não sei o que eu faço pra resolver isso …

[code]
public void atualizatreino(TreinoGeral tg, List<DadosExercicio> de){

this.entityManager.merge(tg);
this.entityManager.flush();

for (DadosExercicio dados: de){

	this.entityManager.merge(dados);
	this.entityManager.flush();
}

}[/code]
Porém o Merge de “dados” é atualizado e o Merde de “tg” é Inserido um novo …[/quote]

isso vai depender, o comportamento do merge é de atualizar sua entidade “se” o atributo anotado com @Id estiver preenchido (com um valor que exista na base… obvio). Te aconselho debugar e olhar isso ou pelo menos dar uns system.out ai pra testar isso.

só é dado o merge em um em decorrência de ter o merge no outro caso na declaração do relacionamento tenha a informação do cascade, caso contrário isso não acontece.

por exemplo, quando for dado o merge na variável tg, somente será dado o merge no(s) DadosExercicio caso a anotação de relacionamento desse atributo na classe TreinoGeral tenha la o CascadeType.MERGE ou o CascadeType.ALL.[/quote]

cascadetype all nao eh o default???

Bem galera, vms lá então.
Quando eu vou inserir os Dados Exercicio eu dou somente um persist em Dados Exercicio e ele automaticamente persiste TreinoGeral:

[code]public void SalvarTreinoD(TreinoGeral tg,List dados){

    for (DadosExercicio td : dados){
    	
    	tg.setSituacao("A");
    	tg.setVar_imprime(1);
        td.setTreinoGeral(tg);
        
        if (td.getVariacao() == 1){    
            td.setImprime(true);    
                
        }else{    
            td.setImprime(false);    
        }    
                
	    this.entityManager.persist(td);    
	    this.entityManager.flush();    
                
     }    
            
}[/code]

Eu tentei fazer o mesmo na hora de atualizar, porém TG não é atualizado.
Como sugerirão dei um Println e ele não esta trazendo o Id de TG porém os outros atributos são trazidos normalmente:

TG SR: 1 TG SAR: 9 TG ID: null System.out.println("TG SR: "+tg.getSessoesrealizadas()); System.out.println("TG SAR: "+tg.getSessoesrestantes()); System.out.println("TG ID: "+tg.getId());

Porém deixei somente dando Merge em “dados” e nem o Update em Dados ele realizou:

for (DadosExercicio dados: de){ this.entityManager.merge(dados); this.entityManager.flush(); }

Segue os mapeamentos:

[code]TreinoGeral
@OneToMany(mappedBy = “treinogeral”)
private List dadostreino;

DadosExercicio
@ManyToOne(cascade =CascadeType.ALL)
@JoinColumn(name=“treinogeral”)
private TreinoGeral treinogeral;[/code]

Eu deveria colocar o Cascade em TreinoGera tb ??

[quote=mauricioadl][quote=maior_abandonado][quote=Diego Adriano]Bom galera, estou com um problema ao tentar utilizar o Merge do EntityManager, ao invés dele me atualizar o Objeto esta me Inserindo um novo, não sei o que eu faço pra resolver isso …

[code]
public void atualizatreino(TreinoGeral tg, List<DadosExercicio> de){

this.entityManager.merge(tg);
this.entityManager.flush();

for (DadosExercicio dados: de){

	this.entityManager.merge(dados);
	this.entityManager.flush();
}

}[/code]
Porém o Merge de “dados” é atualizado e o Merde de “tg” é Inserido um novo …[/quote]

isso vai depender, o comportamento do merge é de atualizar sua entidade “se” o atributo anotado com @Id estiver preenchido (com um valor que exista na base… obvio). Te aconselho debugar e olhar isso ou pelo menos dar uns system.out ai pra testar isso.

só é dado o merge em um em decorrência de ter o merge no outro caso na declaração do relacionamento tenha a informação do cascade, caso contrário isso não acontece.

por exemplo, quando for dado o merge na variável tg, somente será dado o merge no(s) DadosExercicio caso a anotação de relacionamento desse atributo na classe TreinoGeral tenha la o CascadeType.MERGE ou o CascadeType.ALL.[/quote]

cascadetype all nao eh o default???[/quote]

que eu me lembre não, me lembro de vez que esqueci de configurar cascade e testando vi que não pesistiu o objeto relacionado, mas s´pra garantir que eu não iria falar besteira dei uma goooglada para confirmar e encontrei aqui na tabela no meio da página: “By default, JPA does not cascade any persistence operations to the target of the association”.

[quote=Diego Adriano]Segue os mapeamentos:

[code]TreinoGeral
@OneToMany(mappedBy = “treinogeral”)
private List dadostreino;

DadosExercicio
@ManyToOne(cascade =CascadeType.ALL)
@JoinColumn(name=“treinogeral”)
private TreinoGeral treinogeral;[/code]

Eu deveria colocar o Cascade em TreinoGera tb ??[/quote]

se você quer que a sua variavel tg gere um update, ela deve estar gerenciada pelo seu provedor de jpa, com um id preenchido e existente. Se você quer que com isso os dadosTreino seja atualizados também, então na TreinoGeral você deve colocar o cascade na anotação da sua lista dadosTreino (e se for ALL, quando você excluir o TreinoGeral vai excluir também os DadosExercicio por exemplo), e ai o loop do código que você botou no primeiro post seria desnecessário.

Uma explicação mais detalhada, peço aos mais experientes ou aos certificados que me corrijam caso eu esteja falando alguma besteira ai no meio:

Primeiro vejamos o que o merge faz:

O JPA tem um “cache” dos objetos das entidades, quando você busca alguma entidade(s), seja via alguma ejbql, via get passando o id, quando você pega o objeto dessa forma o objeto passa a ser “gerenciado” pelo cache do JPA (do seu provedor de JPA, da implementação que você ta usando).

Então: se você da um merge em um objeto não gerenciado, o retorno do merge é uma cópia desse seu objeto porém essa cópia é gerenciada (o objeto que você passou não), quando eu quero por exemplo excluir um objeto mas ele não está gerenciado eu costumo dar o merge antes só para ter certeza que irei trabalhar com um objeto gerenciado (e passar para o em.remove o retorno do merge). Que eu me lembre (não tenho certeza), isso é necessário. Caso esse objeto seja gerenciado ja, o entity manager vai dar o update quando você der um commit ou flush na linha da tabela com o mesmo id do seu objeto, passando os dados do objeto. Se você simplesmente obter um objeto gerenciado, mudar alguma coisa dele setando algo e dando o commit, então um update vai ser feito na base mesmo que você não tenha dado o merge.

“SE” algum relacionamento desse objeto tiver cascades preenchidos, então o merge também será replicado para os objetos referenciados nos relacionamentos.

Se o seu objeto não contém um id eu não tinha certeza se o insert era feito. Pelo que você disse eu deduzo que faça o insert sim (se o id tivesse preenchido com um objeto ja existente ele daria update e se você tentar inserir um objeto com um id que ja existe daria uma exceção acho que NonUniqueObjectException é o nome… se deu o insert eu imagino que OU seu id não esteja preenchido e você tenha um gerador automatico pra isso, ou o id seja preenchido na mão e esteja com um valor que não existe na base).

Eu te diria para evitar ficar dando flush assim a torto e a direito, você não precisa disso, quando você der o commit tudo será inserido/atualizado/etc… eu teria que confirmar se um rollback funcionaria para desfazer o que ja tivesse sido feito quando você tiver dado o flush…tenho duvidas quanto a isso.

Esse é um exemplo clássico de como JPA facilita nosso trabalho, escrevemos menos código e código mais simples, mas se você não conhecer a especificação você pode ter uns erros “estranhos”, que você não vai saber por quê está acontecendo…

Bem maior_abandonado, seguindo o Link que vc me passou resolvi o problema da seguinte forma:

ALTERANDO O MAPEAMENTO CASCADE DE UMA CLASSE PARA OUTRA FICANDO ASSIM:

[code]TreinoGeral
@OneToMany(mappedBy = “treinogeral”,cascade =CascadeType.ALL)
private List dadostreino;

DadosExercicio
@ManyToOne
@JoinColumn(name=“treinogeral”)
private TreinoGeral treinogeral; [/code]

E MEU MÉTODO DE ATUALIZAÇÃO

[code]public void atualizatreino(TreinoGeral tg){

for (DadosExercicio dados: tg.getDadostreino()){

	this.entityManager.merge(dados);
	this.entityManager.flush();
}
	
this.entityManager.merge(tg);

}[/code]

Ainda não tive tempo de TESTAR o meu método de Inserção, assim que eu testa-lo e funcionar 100% eu altero aqui para RESOLVIDO

Obrigado por enquanto …

[quote=Diego Adriano]Bem maior_abandonado, seguindo o Link que vc me passou resolvi o problema da seguinte forma:

ALTERANDO O MAPEAMENTO CASCADE DE UMA CLASSE PARA OUTRA FICANDO ASSIM:

[code]TreinoGeral
@OneToMany(mappedBy = “treinogeral”,cascade =CascadeType.ALL)
private List dadostreino;

DadosExercicio
@ManyToOne
@JoinColumn(name=“treinogeral”)
private TreinoGeral treinogeral; [/code]

E MEU MÉTODO DE ATUALIZAÇÃO

[code]public void atualizatreino(TreinoGeral tg){

for (DadosExercicio dados: tg.getDadostreino()){

	this.entityManager.merge(dados);
	this.entityManager.flush();
}
	
this.entityManager.merge(tg);

}[/code]

Ainda não tive tempo de TESTAR o meu método de Inserção, assim que eu testa-lo e funcionar 100% eu altero aqui para RESOLVIDO

Obrigado por enquanto …[/quote]

se no seu treinoGeral o cascade dos dados está all, só de você dar o merge nele ja vai dar o merge também nos dados… com o loop ai antes ou sem ele teoricamente deveria fazer a mesma coisa…

Então, eu testei somente com o Loop, mas ai o Merge vai somente em Dados, então com o mapeamento como fiz e o Merge de TG lá em baixo eles funcionam …

voce entendeu errado… era o contrario…

como o seu cascade está na classe TreinoGeral, mais especificamente no atributo da classe treinoGeral, quando você der o merge na TreinoGeral o merge também será dado no atributo Dados onde você colocou o cascade…

aconselho fortemente entender o que faz o código que você está usando…

Pessoal, li o post meio por cima… não sei se vou conseguir ajudar, pois faz algum tempo que trabalhei com JPA, mas vamos lá:
Até onde eu sei para que o Objeto seja atualizado pelo merge, ele deve estar no estado “detached” (desvinculado) e a chamada correta para do merge é:

Objeto objManaged = entityManager.merge(objDetached);

o método merge() recebe o objeto desvinculado e retorna uma cópia atualizada com o valor do banco.

Não sei ajudei em algo…
Att,

Só complementando a mensagem anterior. Se você que atualizar um objeto que está em estado de gerenciado use o refresh().

entityManager.refresh(objeto);

Então, usar o método refresh() ou merge() vai depender do estado do objeto em questão.

Até,

É, realmente retirei o Loop e o Uptdate foi dado nas duas tabelas … Realmente Maior_abandonado pensando naquilo que disse no link que sugeriu realmente entendi o conceito do relacionamento.
Obrigado…
Bem, meu método ficou da seguinte forma:

[code]public void atualizatreino(TreinoGeral tg){

this.entityManager.merge(tg);
this.entityManager.flush();

}[/code]

Bem, como disse iria testar para ver como ficaria a Inserção, bem no Log do Hibernate é criado o Insert, porém é Acusado um erro e não é inserido no BD:
Cod:

[code]public void SalvarTreinoD(TreinoGeral tg){

List de = new ArrayList();

tg.setSituacao(“A”);
tg.setVar_imprime(1);

for (DadosExercicio td : tg.getDadostreino()){
    	
	if (td.getVariacao() == 1){    
        td.setImprime(true);    
                
    }else{    
        td.setImprime(false);    
    }    
            
	de.add(td);
} 
    
tg.setDadostreino(de);
    
this.entityManager.persist(tg);    
this.entityManager.flush();        

}[/code]
Log:

Hibernate: /* insert br.com.treino.model.TreinoGeral */ insert into TreinoGeral (cliente_id, sessoesrealizadas, sessoesrestantes, sessoestotal, situacao, var_imprime, variacao) values (?, ?, ?, ?, ?, ?, ?) Hibernate: /* insert br.com.treino.model.DadosExercicio */ insert into DadosExercicio (descanso, exercicio, imprime, peso, repeticao, serie, treinogeral, variacao) values (?, ?, ?, ?, ?, ?, ?, ?) Hibernate: /* insert br.com.treino.model.DadosExercicio */ insert into DadosExercicio (descanso, exercicio, imprime, peso, repeticao, serie, treinogeral, variacao) values (?, ?, ?, ?, ?, ?, ?, ?)
Erro:

[code]Fev 23, 2012 6:00:52 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
Advertência: #{treinoBean.salvatreino}: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
javax.faces.FacesException: #{treinoBean.salvatreino}: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at br.com.treino.filter.ControleFiltro.doFilter(ControleFiltro.java:33)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
… 26 more
Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1176)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1112)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1118)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:738)
at br.com.treino.repository.TreinoRepository.SalvarTreinoD(TreinoRepository.java:42)
at br.com.treino.bean.TreinoBean.salvatreino(TreinoBean.java:78)
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:601)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 27 more
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:387)
at org.hibernate.engine.Cascade.cascade(Cascade.java:172)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:451)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:158)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:826)
at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:818)
at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:357)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:735)
… 37 more

Fev 23, 2012 6:00:52 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/Treino] threw exception
java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:104)
at br.com.treino.filter.ControleFiltro.doFilter(ControleFiltro.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
[/code]

Sera que é erro no Método ??

[quote=Diego Adriano]É, realmente retirei o Loop e o Uptdate foi dado nas duas tabelas … Realmente Maior_abandonado pensando naquilo que disse no link que sugeriu realmente entendi o conceito do relacionamento.
Obrigado…
Bem, meu método ficou da seguinte forma:

[code]public void atualizatreino(TreinoGeral tg){

this.entityManager.merge(tg);
this.entityManager.flush();

}[/code][/quote]

aconselho ler com mais atenção as respostas que eu dei… em especial o que falei sobre o flush e o commit… (em especial na verdade sobre saber o que faz o código que você esta colocando).

[quote=Diego Adriano]Bem, como disse iria testar para ver como ficaria a Inserção, bem no Log do Hibernate é criado o Insert, porém é Acusado um erro e não é inserido no BD:
Cod:

[code]public void SalvarTreinoD(TreinoGeral tg){

List de = new ArrayList();

tg.setSituacao(“A”);
tg.setVar_imprime(1);

for (DadosExercicio td : tg.getDadostreino()){
    	
	if (td.getVariacao() == 1){    
        td.setImprime(true);    
                
    }else{    
        td.setImprime(false);    
    }    
            
	de.add(td);
} 
    
tg.setDadostreino(de);
    
this.entityManager.persist(tg);    
this.entityManager.flush();        

}[/code]
Log:

Hibernate: /* insert br.com.treino.model.TreinoGeral */ insert into TreinoGeral (cliente_id, sessoesrealizadas, sessoesrestantes, sessoestotal, situacao, var_imprime, variacao) values (?, ?, ?, ?, ?, ?, ?) Hibernate: /* insert br.com.treino.model.DadosExercicio */ insert into DadosExercicio (descanso, exercicio, imprime, peso, repeticao, serie, treinogeral, variacao) values (?, ?, ?, ?, ?, ?, ?, ?) Hibernate: /* insert br.com.treino.model.DadosExercicio */ insert into DadosExercicio (descanso, exercicio, imprime, peso, repeticao, serie, treinogeral, variacao) values (?, ?, ?, ?, ?, ?, ?, ?)
Erro:

[code]Fev 23, 2012 6:00:52 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute
Advertência: #{treinoBean.salvatreino}: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
javax.faces.FacesException: #{treinoBean.salvatreino}: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at br.com.treino.filter.ControleFiltro.doFilter(ControleFiltro.java:33)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
… 26 more
Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1176)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1112)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1118)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:738)
at br.com.treino.repository.TreinoRepository.SalvarTreinoD(TreinoRepository.java:42)
at br.com.treino.bean.TreinoBean.salvatreino(TreinoBean.java:78)
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:601)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 27 more
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.treino.model.DadosExercicio.treinogeral -> br.com.treino.model.TreinoGeral
at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:387)
at org.hibernate.engine.Cascade.cascade(Cascade.java:172)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:451)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:158)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:826)
at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:818)
at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:357)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:735)
… 37 more

Fev 23, 2012 6:00:52 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/Treino] threw exception
java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:104)
at br.com.treino.filter.ControleFiltro.doFilter(ControleFiltro.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
[/code]

Sera que é erro no Método ??[/quote]

sim… é erro no método… para descobrir o motivo é só fazer isso e clicar no primeiro link.