| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/09/2011 12:54:25
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
Quero que o meu objeto saiba como se persistir no banco de dados, ou seja, eu posso chamar:
Uma maneira de obter isso é fazer a minha class Person herdar de PersistentBean.
Só que concordo que heranca nesse caso não cai muito bem, pois estou misturando meus objetos sagrados com infra de persistencia. As pessoas fazem isso direto com as anotacoes de JPA/Hibernate, mas não é o objetivo do tópico entrar nesse mérito.
Então temos o problema clássico dos proxies em Java.
Pensei em fazer isso com um wrapper.
O que vcs acham?
Para resumir tenho 4 opcões:
1 - Ignorar isso e quando quiser persistir um bean eu faco session.update(bean);
2 - Deixo de ser fresco e herdo de PersistentBean
3 - Uso CGLIB (seria uma bazooka para matar mosca?)
4 - Usar o wrapper acima.
Quais que vcs acham melhor? Comentários?
This message was edited 2 times. Last update was at 01/09/2011 12:57:29
|
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) 01/09/2011 12:59:08
|
peerless
GUJ Master
![[Avatar]](/images/avatar/5b2a8f2b014bb326fd82ee313704e78c.jpg)
Membro desde: 22/01/2007 14:52:26
Mensagens: 1391
Localização: Porto Alegre / RS
Offline
|
Oi Sérgio, tudo bem?
Particularmente prefiro evitar isso (cglib, aop) em Java por ser um overhead desnecessário NESTE tipo de cenário... então EU faria a entidade implementar uma interface com os métodos e injetar a implementação ou passar pelo construtor (dessa entidade).
This message was edited 1 time. Last update was at 01/09/2011 13:00:20
|
follow me
pitacos
"The most problems that teams face are about communication, and all the others are too." - Dan North
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/09/2011 13:13:49
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
Bem legal o seu approach. Deixei passar a opcao de composicao que é bem melhor que heranca nesse caso.
No meu caso ficaria assim:
Não quero ter que fazer uma Collection para cada objeto, o seu PersonCollection.
Única desvantagem que vejo nisso é que vc continua atrelando o seu objeto a camada de persistencia, fazendo ele implementar a interface PersistentBean, o que é melhor que heranca com certeza. Mas esse desejo do Java de desacoplamento total talvez seja uma vontade desnecessária.
Então acho que fica assim:
- Se quer desacoplamento total, faz session.update(person) por fora.
- Se quer que o seu objeto tenha essa funcionalidade, usa composicao + interfaces.
This message was edited 2 times. Last update was at 01/09/2011 13:16:36
|
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) 01/09/2011 13:39:08
|
fabiofalci
GUJ Master
![[Avatar]](/images/avatar/c359889a833e7612e0cff1dc69d272bc.png)
Membro desde: 11/04/2006 09:23:14
Mensagens: 1057
Localização: Porto Alegre - RS
Offline
|
Não que eu ache uma boa alternativa, mas vc pode usar aquelas loucuras do spring roo com aspectos.
http://static.springsource.org/spring-roo/reference/html/architecture.html
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/09/2011 14:52:27
|
peerless
GUJ Master
![[Avatar]](/images/avatar/5b2a8f2b014bb326fd82ee313704e78c.jpg)
Membro desde: 22/01/2007 14:52:26
Mensagens: 1391
Localização: Porto Alegre / RS
Offline
|
saoj wrote:
...
Então, concordo contigo sobre ser muito xiita em relação a "desacoplamento total", mas na medida do possível, eu acho bacana. Usei o termo "collections" justamente para não tender o tópico para Domain-Driven Design, mas já que estou comentando: tendo uma interface de negócio (não necessariamente uma por entidade, mas talvez uma por raiz) você consegue um belo desacoplamento entre o negócio e a infra-estrutura. A implementação dessa interface pouco vai importar.
Considere o uso de DI (via AOP, visto que não é comum ter entidades gerenciadas), pois seria bem legal injetar esse cara na entidade.
Aqui um exemplo com Spring.
|
follow me
pitacos
"The most problems that teams face are about communication, and all the others are too." - Dan North
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/09/2011 16:26:46
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
peerless wrote:
...
Injetar esse carinha via setter me parece a melhor alternativa, pois vc não quer construir um Person passando um BeanSession toda hora.
E eu sempre faco injecão por reflection, ou seja, sem necessidade de uma interface setBeanSession. Uma das primeiras coisas que o Mentawai mudou em relacao ao WebWork foi a necessidade daquelas interfaces SessionAware, XXXXXAware. No comeco eu injetava até em campo private, mas depois abandonei essa maluquice.
Só que ter que implementar a interface PersistentBean em tudo que é entidade é não rola, então estou usando composicao mais delegacao.
Estou me forcando a usar delegacao ao inves de heranca.
This message was edited 3 times. Last update was at 01/09/2011 16:41:11
|
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
|
|
|
 |
|
|