| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 11:35:36
|
Jair Rillo Junior
Moderador
![[Avatar]](/images/avatar/31b3b31a1c2f8a370206f111127c0dbd.jpg)
Membro desde: 29/04/2003 21:19:53
Mensagens: 2524
Localização: São Paulo / Campinas
Offline
|
Olá
Estou apanhando feio aqui para conseguir usar o relacionamento many-to-one e 2 Sessões diferentes, ou seja, na primeira sessão eu carrego um objeto e na outra sessão eu tento salvar o objeto que irá possuir o relacionamento. Montei um exemplo bem simples para ficar mais claro o que eu quero. Let´s GO:
Possuo 2 Tabelas no Banco de Dados e 2 Bean.
são eles
Cidades
Clientes
Tanto o ID do Cidades como do Clientes serão preenchidos manualmente.
O Relacionamento está na tabela de Clientes, onde eu possuo a tag <many-to-one assim
Supondo que eu já possuo registros cadastrados na tabela de Cidades (no meu projeto real eu irei ter), eu criei uma classe Principal para carregar o Objeto Cidades do Banco de Dados (primeira session), atribuir esse Objeto cidades ao objeto Clientes e depois salvá-lo (segunda Session).
Segue a classe
Com certeza absoluta o objeto Cidades está com dados preenchidos.
Quando eu tento gravar, da o seguinte erro (inclusive com a propriedade hibernate.show_sql = true).
Hibernate: select cidades0_.codigo as codigo0_, cidades0_.nome as nome0_ from cidades cidades0_ where cidades0_.codigo=?
Hibernate: insert into cidades (nome, codigo) values (?, ?)
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 1062, SQLState: S1009
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Invalid argument value, message from server: "Duplicate entry '2' for key 1"
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 1062, SQLState: S1009
12/08/2004 11:30:54 net.sf.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Invalid argument value, message from server: "Duplicate entry '2' for key 1"
12/08/2004 11:30:54 net.sf.hibernate.JDBCException <init>
SEVERE: Could not execute JDBC batch update
java.sql.BatchUpdateException: Invalid argument value, message from server: "Duplicate entry '2' for key 1"
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1394)
Note-se que primeiro ele faz um Select para preencher o objeto Cidades (primeira session) e na hora de salvar o objeto (Clientes) ele tenta primeiro salvar novamente o objeto (cidades) assim gerando uma exception de ID duplicate.
Se eu fizer tudo em uma única Session funciona normal. Mas eu estou tentando fazer assim, pois no meu projeto real, eu primeiro irei carregar o Objeto cidades, depois carregar outras telas, esperar o usuário digitar os dados do cliente para depois gravar (consequentemente irei usar mais que 1 session).
Alguem poderia me ajudar com isso fazendo favor?
Obrigado
|
Jair Rillo Junior
http://www.jairrillo.com/blog | Twitter | SCJA, SCJP, SCWCD, SCBCD, IBM SOA Associate |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 13:32:06
|
ricardolecheta
GUJ Master
![[Avatar]](/images/avatar/b59c67bf196a4758191e42f76670ceba.jpg)
Membro desde: 17/05/2003 13:42:10
Mensagens: 1486
Localização: Curitiba
Offline
|
Tenta fazer isso na segunda session:
|
Ricardo R. Lecheta
Livro - Google Android (português)
http://www.livroandroid.com.br/
http://livroandroid.blogspot.com/
http://www.livetouch.com.br/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 13:57:22
|
Jair Rillo Junior
Moderador
![[Avatar]](/images/avatar/31b3b31a1c2f8a370206f111127c0dbd.jpg)
Membro desde: 29/04/2003 21:19:53
Mensagens: 2524
Localização: São Paulo / Campinas
Offline
|
Obrigado por responder Ricardo.
eu fiz isso o que você disse e agora da outro erro
Hibernate: select cidades0_.codigo as codigo0_, cidades0_.nome as nome0_ from cidades cidades0_ where cidades0_.codigo=?
net.sf.hibernate.HibernateException: cannot lock an unsaved transient instance: [br.com.junior.models.Cidades]
at net.sf.hibernate.impl.SessionImpl.lock(SessionImpl.java:1671)
at br.com.junior.actions.Principal.main(Principal.java:3
Exception in thread "main"
a Segunda session ficou assim
|
Jair Rillo Junior
http://www.jairrillo.com/blog | Twitter | SCJA, SCJP, SCWCD, SCBCD, IBM SOA Associate |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 14:29:28
|
Filipe Sabella
GUJ Expert
Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline
|
Já tentou salvar e depois dar o Lock?
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 14:34:11
|
Jair Rillo Junior
Moderador
![[Avatar]](/images/avatar/31b3b31a1c2f8a370206f111127c0dbd.jpg)
Membro desde: 29/04/2003 21:19:53
Mensagens: 2524
Localização: São Paulo / Campinas
Offline
|
LIPE wrote:Já tentou salvar e depois dar o Lock?
Tentei sim, mas pela lógica primeiro você deve dar lock.
Se eu por o Lock depois do Save, vai dar erro de Duplicate
|
Jair Rillo Junior
http://www.jairrillo.com/blog | Twitter | SCJA, SCJP, SCWCD, SCBCD, IBM SOA Associate |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 14:47:16
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Por que voce ta usando 2 sessions? Não consigo ver qual a utilidade.
Uma regrinha de ouro quando se usa o Hibernate é evitar a todo custo misturar objetos de sessions diferentes.
De uma olhada no pattern de unit-of-work, que é o conseito por traz da interface Session.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 15:04:13
|
Jair Rillo Junior
Moderador
![[Avatar]](/images/avatar/31b3b31a1c2f8a370206f111127c0dbd.jpg)
Membro desde: 29/04/2003 21:19:53
Mensagens: 2524
Localização: São Paulo / Campinas
Offline
|
louds wrote:Por que voce ta usando 2 sessions? Não consigo ver qual a utilidade.
Uma regrinha de ouro quando se usa o Hibernate é evitar a todo custo misturar objetos de sessions diferentes.
De uma olhada no pattern de unit-of-work, que é o conseito por traz da interface Session.
No exemplo que eu coloquei ae em cima, realmente não é necessário ter 2 Sessions, mas eu fiz apenas para testar.
No meu projeto "REAL" (nada comercial), minha idéia é criar apenas uma classe DAO. Dentro dessa classe, eu tenho um método chamado insert assim
Eu gostaria de deixar esse método genérico para todos e qualquer tipo de save de objetos.
Assim para eu poder salvar um objeto com relacionamento, na classe que irá chamar o método insert, eu primeiro dou um DAO.load (e carrego a Cidades) e depois eu jogo um DAO.insert (salvo o clientes), consequentemente cada 1 ficando em Sessions diferentes
-- Editado---
Idéias para essa solução também são muito bem vindas
|
Jair Rillo Junior
http://www.jairrillo.com/blog | Twitter | SCJA, SCJP, SCWCD, SCBCD, IBM SOA Associate |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 15:24:52
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Voce tá confundindo quais as responsabilidades de um DAO. Ele deve apenas fazer o leva-e-traz entre seus objetos e o DB, controle de transação e gerenciamento de sessão tem de ficar em outra camada.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/08/2004 15:43:59
|
alex.lopes
JavaGuru
Membro desde: 17/12/2002 12:36:08
Mensagens: 215
Offline
|
Estou querendo implementar um sistema em Hibernate e Webwork.
Estou ainda aprendendo Webwork e hibernate eu sou iniciante (não conhecia o lance de many-to-one).
Agora o que o louds disse sobre o DAO, eu particularmente não sabia.
Será que alguém tem algum exemplo de como funciona as funcionalidade de um DAO e de controle de transação? exemplo básico ou algum sistema que eu possa estudar seu funcionamento?
Obrigado
Alex
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/08/2004 11:13:27
|
alex.lopes
JavaGuru
Membro desde: 17/12/2002 12:36:08
Mensagens: 215
Offline
|
Aproveitando o mesmo tópico.
É interessante utilizar Herança para modelar os meus modelos do banco de dados? Lendo a documentação do hibernate me parece que posso usar a tag (subclass) que é responsável por fazer essa herança certo?
Alguém com experiência em Hibernate aconselha fazer herança nesses casos?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/10/2008 13:59:11
|
kirmaier
What is classpath?
![[Avatar]](/images/avatar/00701bfa411bb151a8516b9730037148.png)
Membro desde: 29/07/2008 07:37:07
Mensagens: 9
Offline
|
Estou passando pelo mesmo problema.. tenho o objeto Grupo.. e este possui vários Jogadores.. eu abro o objeto grupo..e vou injetar os jogadores dentro dele.. quando injeto o 1° Jogador funciona blza... na vez do 2°, já era... da esse erro:
Minha classe GrupoController que fiz para realizar toda essa transação está desta forma:
Alguém poderia dar uma luz....
Desde já obrigado!
|
" Enjoy life " |
|
|
 |
|
|