Relacionamento unidirecional one to one sem persistencia na tabela "filha"

26 views
Skip to first unread message

Carlos Amaral

unread,
Sep 12, 2014, 11:13:19 AM9/12/14
to ce...@googlegroups.com
Olá Grupo.

Preciso de ajuda na seguinte questão :

Por tratar-se de um legado que não pode ser remodelado (por enquanto) pois está sendo "portado", precisei criar uma tabela auxiliar, gravando o número da chave, saber quais chaves foram processadas por recebimento via email, ou que foram baixadas pelo aplicativo.
Agora, preciso "mostrar" no dataTable se determinada nota foi baixada ou processada por email.

Quando a Nota é baixada pelo novo aplicativo, todas as colunas da tabela atual são preenchidas, e populo também um novo registro na tabela "chavebaixada". Isto determina qual a origem de determinada nota.

Gostaria de saber como faço, agora, para definir um "boolean", com estas informações.

Tabela NFe : id, chave, nome, endereco, valor, e todos os campos, pk, getters e setters, construtor vazio, hashCode, equals, toString
Tabela ChaveBaixada : campo chave (varchar(44)), que é o id, a pk, getters n setter, construtor vazio, hashCode, equals e toString

Quero "montar" uma propriedade na tabela NFe, tipo "boolean" para o caso de existir a mesma chave na tabela ChaveBaixada. Este campo não será persistido nesta tabela, nem na filha... é apenas um campo "consulta"...

Acho que consegui explicar.

Abraço a todos.

Rafael Ponte

unread,
Sep 12, 2014, 11:46:38 AM9/12/14
to ce...@googlegroups.com
Oi Carlos,

Sinceramente não ficou muito claro para mim o problema que você tem e quer resolver. Acho que estou meio lento hoje, sexta-feira, sabe como é... Poderia explicar de outra forma?

Um abraço!


--
Você recebeu essa mensagem porque está inscrito no grupo quot;CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Carlos Amaral

unread,
Sep 12, 2014, 3:21:49 PM9/12/14
to ce...@googlegroups.com
Rafael, obrigado pelo retorno. Na realidade, se vc não entendeu, é porque eu devo ter sido muito ruim... talvez eu é que esteja bem lento hoje rsrsr

Gravei um vídeo de 4 minutos explicando.

O link é https://www.youtube.com/watch?v=6SFjyfIT5r8

Obrigado e abraço.

Diogo Dias

unread,
Sep 12, 2014, 3:49:44 PM9/12/14
to ce...@googlegroups.com
Olá Carlos,
se você estiver usando a implementação do Hibernate você pode usar a anotação @Formula em um atributo da sua classe NFe.
Nessa anotação você faz uma query que verifica se a nfe em questão está associada a tabela filha. Acho que isso resolve o seu problema. Só tome cuidado com a performance disso.

Espero ter ajudado..

Abraço,
Diogo Dias
       
Att,
Diogo Dias

Diogo Dias

unread,
Sep 12, 2014, 3:53:39 PM9/12/14
to ce...@googlegroups.com
Ou você pode fazer um left join com a tabela filha e na hora de montar a tela verificar se o atributo existe.
--
Att,
Diogo Dias

Flavio Cysne

unread,
Sep 12, 2014, 3:57:49 PM9/12/14
to ce...@googlegroups.com
Carlos,

    espero que essa solução sirva p/ o seu problema:

    - criar um campo do tipo CHAR(1), não obrigatório, com o valor default 'S', que será preenchido com 'S' sempre que o registro for feito pelo legado.
    - na seu código onde você importa os registros de Nfe baixados do site da SEFAZ estes registros seriam preenchido com 'N'

    dessa forma a sua entidade teria um atributo Boolean, mapeando o true p/ 'S' e o false p/ 'N', no hibernate

    Esse mapeamento é apenas uma sugestão e os valores 'S' e 'N' também. Se você já tem valores mapeados p/ o boolean no hibernate ficam valendo os seus.

Em 12 de setembro de 2014 16:21, Carlos Amaral <chayim...@gmail.com> escreveu:

Carlos Amaral

unread,
Sep 12, 2014, 4:04:18 PM9/12/14
to cejug
Flavio, obrigado pela interação.

Realmente esta seria a solução mais fácil e prática, mas, como disse, não posso alterar absolutamente nada das tabelas legadas, por isto a minha dificuldade.

Mas obrigado pela preocupação. Abraço.

Carlos Amaral, MBA, PRINCE2
(48) 9624-9470
Skype : chayimamaral
Site : www.carlosamaral.eti.br
LinkedIn : http://br.linkedin.com/in/carlosamaralgp

Carlos Amaral

unread,
Sep 12, 2014, 4:04:57 PM9/12/14
to cejug
Opa. Obrigado Diogo.

Vou dar uma olhada neste material. Só pelo título do post, parece realmente ser o que eu preciso.

Abraço.

Carlos Amaral, MBA, PRINCE2
(48) 9624-9470
Skype : chayimamaral
Site : www.carlosamaral.eti.br
LinkedIn : http://br.linkedin.com/in/carlosamaralgp

Em 12 de setembro de 2014 16:49, Diogo Dias <diogo....@gmail.com> escreveu:

Flavio Cysne

unread,
Sep 12, 2014, 4:05:43 PM9/12/14
to ce...@googlegroups.com
Carlos,

    retificando...

    onde tem: "...você importa os registros de Nfe baixados do site da SEFAZ..."
    Lê-se: "... você insere os registros recebidos por e-mail..."

Em 12 de setembro de 2014 16:57, Flavio Cysne <flavi...@gmail.com> escreveu:

Rafael Ponte

unread,
Sep 14, 2014, 6:20:20 PM9/14/14
to ce...@googlegroups.com
Oi Carlos,

O vídeo foi muito esclarecedor! Vi que você já tem uma boa experiência com vídeos! :-)

Acredito que os comentários do pessoal aqui já te ajudaram e te deram um norte legal, mas apenas para complementar: tanto o @Formula quanto um novo mapeamento pode te ajudar, só é preciso tomar cuidado com este último na consulta, pois você vai precisar de um left outer join, já que por padrão o Hibernate/JPA usam inner join nas consultas com JPQL e Criteria.


Carlos Amaral

unread,
Sep 14, 2014, 6:28:30 PM9/14/14
to cejug
Oi Rafael.

Na realidade, a dica do @Formula foi ótima, mas depois é que lembrei que o framework usa EclipseLink, além de outro problema :

A população da tabela chavebaixada ocorre no momento do download do arquivo do Sefaz, onde apenas armazeno a "chave" que está sendo baixada.
Este "arquivo" será processado por outro aplicativo.
Revendo o aplicativo, percebi que posso sim criar outro campo.
A solução será um trigger no momento que estiver populando a tabela cadnf_xml, onde vou procurar (after insert) na tabela "chavebaixada" a existencia ou não da chave que está sendo gravada. Se existir, passo o campo que criei "baixado" para true.

Estou fazendo os teste e gravarei novo vídeo explicando a solução e postarei aqui no grupo. Se achar interessante, posso postar no JSF também.

Abraço e sucesso.

Carlos Amaral, MBA, PRINCE2
(48) 9624-9470
Skype : chayimamaral
Site : www.carlosamaral.eti.br
LinkedIn : http://br.linkedin.com/in/carlosamaralgp

Marcus Mazzo Laprano

unread,
Sep 14, 2014, 6:31:35 PM9/14/14
to ce...@googlegroups.com

Ja viu sobre campos transientes? Pelo que entendi vc precisa criar um campo que não será persistido correto? Se for isso cria um atributo e anota ele com @Transient que vc terá a propriedade mas a mesma não será persistida. Na consulta vc teria que adicionar o respectivo valor para o campo transiente... exemplo se não tiver vindo os dados preenchidos esse campo seria true (nota baixada) se veio (nota via email) seria false... algo do tipo...
Me perdoe se não tiver compreendido corretamente seu problema.

Rafael Ponte

unread,
Sep 14, 2014, 6:32:20 PM9/14/14
to ce...@googlegroups.com
Não tenho experiência de verdade com EclipseLink, mas acho que esse post no Stackoverflow pode te ajudar, http://stackoverflow.com/questions/12014100/there-are-a-formula-like-annotation-to-set-calculated-field-from-subquery-in-jp

Carlos Amaral

unread,
Sep 17, 2014, 12:39:25 PM9/17/14
to ce...@googlegroups.com
Pessoal, boa tarde.

Resolvi postar a solução que, às vistas dos mais puristas, chega a ser abominável (usei trigger rsr).

Mas para registro e ideias, aí está a solução final.

Agradeço a todos que interagiram apontando possíveis soluções. Também estou "flagando" o post como Concluído.

http://youtu.be/yNFgCZQvg6s

Rafael Ponte

unread,
Sep 19, 2014, 11:20:46 AM9/19/14
to ce...@googlegroups.com
Muito bom, Carlos! Que legal que deu tudo certo!

--
Você recebeu essa mensagem porque está inscrito no grupo quot;CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.

Diogo Dias

unread,
Sep 19, 2014, 11:32:11 AM9/19/14
to ce...@googlegroups.com
Beleza Carlos...Que bom que conseguiu resolver!!

Abraço

--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att,
Diogo Dias
Reply all
Reply to author
Forward
0 new messages