Hibernate - Tentando usar many-to-one com 2 Session  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Jair Rillo Junior
Moderador
[Avatar]

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
ricardolecheta
GUJ Master
[Avatar]

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/
Jair Rillo Junior
Moderador
[Avatar]

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
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.
[ICQ]
Jair Rillo Junior
Moderador
[Avatar]

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
louds
Moderador
[Avatar]

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
[ICQ]
Jair Rillo Junior
Moderador
[Avatar]

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
louds
Moderador
[Avatar]

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
[ICQ]
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
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?
kirmaier
What is classpath?
[Avatar]

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 "
[MSN] [ICQ]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team