Dúvida sobre persistência de objetos de uma classe Moeda  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
David
JavaEvangelist
[Avatar]

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
[WWW]
rodrigoy
GUJ Ranger
[Avatar]

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

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
[Email] [WWW] [Yahoo!] [MSN]
David
JavaEvangelist
[Avatar]

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
[WWW]
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 ?

pcalcado
Moderador
[Avatar]

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
[Email] [WWW] [Yahoo!] [MSN]
David
JavaEvangelist
[Avatar]

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

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
[Email] [WWW] [Yahoo!] [MSN]
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.
pcalcado
Moderador
[Avatar]

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
[Email] [WWW] [Yahoo!] [MSN]
David
JavaEvangelist
[Avatar]

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
[WWW]
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.
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

[WWW] [MSN] [ICQ]
drix
JavaBaby
[Avatar]

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?
[MSN]
David
JavaEvangelist
[Avatar]

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
[WWW]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team