| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 15:26:24
|
David
JavaEvangelist
![[Avatar]](/images/avatar/77431ca7981f1f1483ae8a58bcbb6e0e.jpg)
Membro desde: 18/03/2005 13:10:33
Mensagens: 450
Localização: Natal/RN
Offline
|
Pessoal, estou com uma dúvida aqui que deve ser idiota, mas eu não consegui encontrar informações suficientes no Google para resolvê-la. A dúvida surgiu após ler o artigo do Phillip na Mundo Java 17.
Imaginem que eu tenha uma classe Moeda, por exemplo, que tem dois atributos: um do tipo long e seria o número de centavos de uma determinada quantia em dinheiro (para evitar problemas de operações com ponto flutuante), o outro seria um objeto java.util.Currency que serveria para dizer em qual moeda aquela quantia está (Real, Dólar, Euro, etc.). Imaginem ainda uma classe Pedido que tem como um de seus atributos o valorTotal do pedido, do tipo Moeda.
A dúvida é: como se daria a persistência dessa moeda em um banco de dados? Na tabela pedido eu deveria ter uma coluna para a quantidade de centavos e outra para a moeda? Se sim e eu estiver usando o hibernate, como seria feito o mapeamento de Pedido? Se não, como eu deveria fazer? Desculpem se não fui claro.
Para finalizar, alguém já viu ou usou isso aqui? http://www.jvalue.org/
Editado: Não gostei do título, mas não consegui imaginar nada muito bom. Se alguém tiver alguma sugestão...
|
David Pereira
Engenheiro de Computação - UFRN
Mestre em Engenharia Elétrica
Doutorando em Engenharia Elétrica |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 15:54:45
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
David,
Para não ter problemas de ponto flutuante você pode usar o BigDecimal. Sobre o mapeamento no hibernate:
http://www.hibernate.org/hib_docs/v3/reference/en/html/components.html
[]s
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 16:23:07
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Oi,
Depende bastante. Como sua empresa(ou cliente) quer guardar valores monetários no banco de dados? Centavos e inteiro separados? Só centavos? um double?
Seja como for, acredito que um mapeamento de componente (linkado pelo Rodrigo) seja o que você procura. Value objects como moedas ou datas dificilmente vão ter uma tabela própria ou coisa do tipo, eles geralmente ficam na mesma tupla da Entity que o referencia.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 16:44:07
|
David
JavaEvangelist
![[Avatar]](/images/avatar/77431ca7981f1f1483ae8a58bcbb6e0e.jpg)
Membro desde: 18/03/2005 13:10:33
Mensagens: 450
Localização: Natal/RN
Offline
|
No momento eu não estou fazendo nada no momento que precise disso, foi apenas uma dúvida que surgiu após a leitura do artigo. E eu acredito que mapeamento de componentes faça o que eu quero mesmo! Muito obrigado!
|
David Pereira
Engenheiro de Computação - UFRN
Mestre em Engenharia Elétrica
Doutorando em Engenharia Elétrica |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 17:53:46
|
okara
JavaTeenager
Membro desde: 16/05/2005 08:47:08
Mensagens: 152
Offline
|
Uma dúvida.
Se você trabalha com apenas duas casas é necessário usar o BigDecimal;
Já tive problemas com o double em operações de comparação.
Mas resolvi isto.
É recomendável usar double ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 18:04:28
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Double não deve ser usado para matemática exata, não foi feito para isso. Até hoje 99% dos sistemas que trabalhei (excluindo apenas um fortemente baseado em estatística) não deveriam usar double. Provavelmente é o seu caso.
Use Bigdecimal ou uma classe de Moeda, como sugerido no artigo em questão.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 18:18:48
|
David
JavaEvangelist
![[Avatar]](/images/avatar/77431ca7981f1f1483ae8a58bcbb6e0e.jpg)
Membro desde: 18/03/2005 13:10:33
Mensagens: 450
Localização: Natal/RN
Offline
|
pcalcado wrote:(,,,) não deveriam usar double. (...)
Não deveriam mas foi usado? Ou você realmente não usou? Se usou, o que fez para resolver os problemas?
Eu estou trabalhando num sistema em que o double não deveria ter sido usado, mas por falta de experiência nossa no início (o projeto tem mais de dois anos), ele foi. Estou tendo uns problemas chatos agora, pois uns relatórios financeiros ficam dando diferenças de 1 centavo para mais ou para menos, mas infelizmente estamos sem tempo para fazer um refactoring.
|
David Pereira
Engenheiro de Computação - UFRN
Mestre em Engenharia Elétrica
Doutorando em Engenharia Elétrica |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/06/2006 18:35:10
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Foram usados. Se você olhar meu curriculum vai ver que nos últimos anos eu tenho praticamente refatorado sistemas de todos os tamanhos.
Refatorar de double pra Bigdecimal/Moeda não é fácil. É normal quando se falta experiência mas depois que se aprende uma vez é apra nunca mais usar mesmo. Lembro de um sistema de gerência de empréstimos que fiz (nad aa ver com o exemplo da revista, por acaso) que foi onde descobri sobre doubles. Simplesmente a cotna nunca batia com a do sistema que eu estava substituindo, eram poucos mas imperdoáveis centavos de diferença.
No meu projeto atual, além de refatorar dois sistemas eu estou criando um novo, que lida basicamente com vendas, e este não usa double, apenas Moeda.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 10:52:18
|
oyama
Virtual Machine Man
Membro desde: 19/04/2005 10:11:09
Mensagens: 572
Offline
|
Uma solução adotada em um dos projetos da minha empresa foi fazer instrumentação do código (bytecode enhancement). Desta forma foram utilizadas operações com double em código-fonte, mas na execução, as contas eram feitas com BigDecimal. Esta solução foi escolhida para não poluir o código, pois pode-se usar os operadores matemáticos em expressões complexas.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 10:54:55
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
i.e. bytecode enhancement porque Java não tem sobrecarga de operador.
Bom, que tal especificar fórmulas complexas em Groovy? Na verdade a idéia pode evoluir para uma DSL.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 11:16:42
|
David
JavaEvangelist
![[Avatar]](/images/avatar/77431ca7981f1f1483ae8a58bcbb6e0e.jpg)
Membro desde: 18/03/2005 13:10:33
Mensagens: 450
Localização: Natal/RN
Offline
|
Como isso seria feito, Phillip? Poderia dar um exemplo?
|
David Pereira
Engenheiro de Computação - UFRN
Mestre em Engenharia Elétrica
Doutorando em Engenharia Elétrica |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 13:42:59
|
okara
JavaTeenager
Membro desde: 16/05/2005 08:47:08
Mensagens: 152
Offline
|
Essa classe Moeda seria uma classe personalizada ?
Alguém tem um exemplo de como fazer um mapeamento no hibernate para
uma classe Moeda personalizada ?
Obs: Sei qque posso encontrar no Google, mas gostaria de ouvir a opinião pessoal e a experiência de vocês.
oyama wrote:
Uma solução adotada em um dos projetos da minha empresa foi fazer instrumentação do código (bytecode enhancement). Desta forma foram utilizadas operações com double em código-fonte, mas na execução, as contas eram feitas com BigDecimal. Esta solução foi escolhida para não poluir o código, pois pode-se usar os operadores matemáticos em expressões complexas.
Que ferramenta você usou para isto ?
Fiquei muito interessado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 14:28:55
|
fabio.patricio
GUJ Master
Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline
|
pcalcado wrote:Bom, que tal especificar fórmulas complexas em Groovy? Na verdade a idéia pode evoluir para uma DSL.
Em um dos clientes que atendo o modulo de calculo foi todo feito com Jython e provavelmente iremos migrar para Groovy.
]['s
|
Fabio Patricio
http://blog.wansoft.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 14:41:31
|
drix
JavaBaby
![[Avatar]](/images/avatar/b578f2a52a0229873fefc2a4b06377fa.png)
Membro desde: 16/06/2006 14:42:48
Mensagens: 84
Localização: Maringá - Paraná
Offline
|
Pessoal!
Qual o número da revista com o Artigo?
Poderiam postar o código fonte da classe Moeda?
Algum exemplo com bigDecimal?
|
JDRIx
=/=/=/=/=/=/=/
Café? Servido? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 15:12:30
|
David
JavaEvangelist
![[Avatar]](/images/avatar/77431ca7981f1f1483ae8a58bcbb6e0e.jpg)
Membro desde: 18/03/2005 13:10:33
Mensagens: 450
Localização: Natal/RN
Offline
|
okara wrote:
Essa classe Moeda seria uma classe personalizada ?
Sim, ver abaixo.
okara wrote:
Alguém tem um exemplo de como fazer um mapeamento no hibernate para uma classe Moeda personalizada?
Veja o post acima do rodrigoy sobre componentes no hibernate.
drix wrote:
Qual o número da revista com o Artigo?
Poderiam postar o código fonte da classe Moeda?
Algum exemplo com bigDecimal?
Não estou com a revista aqui mas foi essa última, cuja matéria de capa é a de TV Digital. A classe moeda seria algo assim:
Eu pensei ainda em colocar um atributo java.util.Currency para dizer em qual moeda aquele valor estava, pois as vezes eu preciso trabalhar com moedas diferentes.
E sobre o BigDecimal: http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html
|
David Pereira
Engenheiro de Computação - UFRN
Mestre em Engenharia Elétrica
Doutorando em Engenharia Elétrica |
|
|
 |
|
|