| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 13:29:09
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
No tutorial do Hibernate ele explica como criar e proteger relacionamentos bi-direcionais. Só ficou a seguinte dúvida:
Pessoas tem eventos e Eventos tem pessoas.
Beleza. Não tem como ninguém modificar o set participants sem passar pelo add e pelo del.
Só que eu quero ter acesso ao Set para listar os participantes, isto é, quero ter um método publico getParticipants(). Só que aí a segurança é perdida, pois qualquer um poderia meter um participante no set depois de charmar getParticipants().
Soluções:
1) No getParticipants() fazer return Collections.unmodifiableSet(participants); (NAO FUNCIONA NO HIBERNATE!)
Erro: Exception in thread "main" org.hibernate.AssertionFailure: collection was not processed by flush()
2) No getParticipants() dar um clone no Set antes de retornar. Não testei isso, mas se a lista for muito grande isso deve ser uma bosta. Ainda mais que o Hibernate tá acessando essa função toda hora!
3) Criar um outro método público e deixar o getParticipants() privado mesmo. Ex:
Mas aí o nome vai está fora do padrão JavaBean e vou ter que fazer: user.participantsSet na camada view.
4) Deixar aberto mesmo e confiar que ninguem vai adicionar um participante por fora.
Qual é a melhor solução: 1), 2), 3) ou 4) ????
This message was edited 2 times. Last update was at 14/07/2005 16:16:39
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 13:35:06
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
Só encontrei um problema nesta abordagem!
Melhor, é uma crítica...
Suponha que vc cria uma uma classe que extenda ArrayList, chamada MeuArrayList... e tendo o seguinte código
Quando vc tentar fazer isso:
Será lançado um ClassCastException!
Talvez nem precise criar o MeuArraYList... acho que se vc fazer qualquer tipo de cas com uma lista que não pode ser modificado sempre acontecerá este erro!
Abraços!
Thiago Senna
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 13:39:10
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
Pelo que entendi a desvantagem de usar unmodifiedSet é que ele sempre vai retornar um Set e nunca um MySet.
Beleza, valeu pela dica pois eu realmente nao sabia disso, mas a questão não é essa.
A questão é como proteger o set ???
1), 2), 3) ou 4 ?
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 13:41:39
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
5) Retorna apenas o Iterator dos participantes.
Thiago Senna
This message was edited 2 times. Last update was at 14/07/2005 13:44:54
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 13:45:01
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
Thiago wrote:
5) Retorna apenas o iterator dos participantes!
Boa idéia. Mas tem dois problemas que vc não pensou:
1) Vou ter que mudar de qualquer jeito o nome da função, fugindo do padrão. (Ex: getParticipantsIterator())
2) E principalmente iterator tem remove() !
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 13:50:23
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
humm.. entendi..
entaum eu ficaria com a opção 4!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 14:39:20
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Isso é uma opção do hibernate mesmo. Você tem que escolher de qual lado atualizar. Isso é para não violar as espectativas que temos dos pojos.
Eu tenho o habito de escrever unit tests e evitar usar qualquer API do hibernate nos meus POJOs. Usando apenas java.util não vou ter como garantir que as relações bidirecionais sejam preservadas sem escrever toneladas de código.
Bele, não faço isso e deixo meus pojos durante os testes sem isso. Quando eles estiverem sendo usados pelo hibernate, e tivessemos relacionamentos bidirecionais, ia dar um porrada de problemas.
|
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) 14/07/2005 15:46:12
|
Filipe Sabella
GUJ Expert
Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline
|
Coloca access="field" para esta propriedade e seja feliz.
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 16:17:15
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
LIPE wrote:Coloca access="field" para esta propriedade e seja feliz.
Fui feliz !
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 16:23:07
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Sérgio, só tome cuidado com qual lado da tua relação atualiza ela. E nunca coloque os dois para fazer isso.
|
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) 14/07/2005 16:29:03
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
louds wrote:Sérgio, só tome cuidado com qual lado da tua relação atualiza ela. E nunca coloque os dois para fazer isso.
Não estou usando hibernate, mas deve ser por isso que ontem meus testes unitários dos DAO's pularam de 3 segundos para 96 segundos!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 16:32:15
|
jack_-_ganzha
JavaEvangelist
![[Avatar]](/images/avatar/847cc55b7032108eee6dd897f3bca8a5.jpg)
Membro desde: 31/03/2003 13:18:12
Mensagens: 315
Localização: Recife - Pernambuco
Offline
|
louds wrote:Sérgio, só tome cuidado com qual lado da tua relação atualiza ela. E nunca coloque os dois para fazer isso.
Oi, louds, por que não?
valeuz...
|
Marcos Silva Pereira
http://www.javafree.org
http://marcospereira.wordpress.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 16:35:47
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
bom.. naum sei se te ajudaria jack, mas comigo foi assim..
empresa carregava servicço prestado, servicoprestado carregava empresa, empresa carrega servico prestado, servicoprestado carrega empresa, empresa carregava servicço prestado, servicoprestado carregava empresa, empresa carrega servico prestado, servicoprestado carrega empresa, empresa carregava servicço prestado, servicoprestado carregava empresa, empresa carrega servico prestado, servicoprestado carrega empresa, empresa carregava servicço prestado, servicoprestado carregava empresa, empresa carrega servico prestado, servicoprestado carrega empresa, empresa carregava servicço prestado, servicoprestado carregava empresa, empresa carrega servico prestado, servicoprestado carrega empresa, empresa carregava servicço prestado, servicoprestado carregava empresa, empresa carrega servico prestado, servicoprestado carrega empresa.
É isso né???
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/07/2005 17:03:37
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Não thiago, isso é por que você não está usando first level caching
O problema é o seguinte:
A.getBs().add(B);
B.getAs().add(A);
Isso vai gerar:
//atualizando relacionamentos de A
insert into AxB(A.id, B.id)
//atualizando relacionamentos de B
insert into AxB(A.id, B.id)
This message was edited 1 time. Last update was at 14/07/2005 17:03:58
|
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) 14/07/2005 17:10:17
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
Estou inserindo em ambas as listas em ambos os lados, obviamente sem colocar a coisa num loop infinito.
Não devo fazer isso ???????????????????
No tutorial do hibernate ele diz que não há problema nisso.
?????
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
|
|