Pergunta

Eu tenho um aplicativo corporativo Java que fornece um serviço web, tem uma camada de domínio, e uma camada de persistência Hibernate. Neste caso particular, não há uma enorme diferença (no momento) entre os objetos que eu enviar sobre o fio, os objetos de domínio, e os objetos de persistência.

Atualmente, o aplicativo usa DTO no lado da persistência e anota as classes de domínio com anotações JAXB. No entanto, quanto mais eu leio e pensar sobre isso, mais isso parece para trás! (Para não mencionar há um monte de código para apoiar as costas sem sentido e para trás entre o DTO e objetos do domínio.) Parece que a maioria dos arquitetos sugerem puting anotações JPA sobre o modelo de domínio e criar DTO para o envio de objetos sobre o fio.

No meu caso, eu poderia colocar tanto o JAXB e JPA anotações (hibernação) em minhas classes de domínio?

O pensamento de manter a minha fachada de serviço web, o meu domínio, e minha persistência todos firmemente agrupados parece fácil de manter, mas faz-me preocupação uma vez que estes podem precisar de mudar com o tempo. Mas seria mais inteligente para criar um conjunto de classes DTO para o lado de serviços web e ignorar o DTO para o lado de persistência?

Foi útil?

Solução

Não há nenhuma razão funcional para não anotar a mesma classe com ambas as anotações JPA e JAXB, eu mesmo já fiz isso na ocasião. Ele se torna um pouco difícil de ler, embora, e às vezes você quer diferentes trocas de design de classe com JAXB e JPA. Na minha experiência, esses trade-offs normalmente significa que você acabar com dois modelos de classe.

Outras dicas

Eu concordo que usando as mesmas classes de modelo é a abordagem correta. Se você está preocupado com a desordem anotação, você poderia usar uma implementação de JAXB (como EclipseLink JAXB ), que fornece um mecanismo para externalizar os metadados:

Além disso, desde que você está usando um modelo JPA EclipseLink JAXB (MOXY) tem extensões para tornar isso mais fácil:

Aqui está um exemplo do uso de um modelo com JAXB & JPA para criar um serviço RESTful:

Não há nenhum problema em usar ambas as anotações na mesma classe. Eu mesmo tendem a incentivar isso, porque, assim, você não tem que copiar e colar quando ocorrem alterações. Em alguns casos, algumas propriedades diferem em comportamento - por exemplo, um ID auto-gerado não pode ser obrigado a ser empacotado. @XmlTransient e @Transient são então combinados. Ele se torna um pouco difícil de ler, mas não muito difícil, porque é óbvio que todas as anotações dizer.

Qualquer um tentado a colocar objetos de link átomo em seu domínio persistente porque você se comprometeram a definir sua estrutura xml web service lá? Parece estranho para mim fazer isso. ligações HATEOAS parecer uma boa idéia, mas o domínio persistente ea impl serviço (não o serviço web) não têm interesse em ligações atômicas. Então, novamente, usando anotações XML e ter jersey serializar meu domínio para mim certamente é conveniente. Outra desvantagem dessa abordagem é que embora ele é fácil de afetar seus consumidores de serviços web em tempo de execução com o domínio persistência "camada" refatoração.

Eu sei que esta questão é um pouco velho, mas eu pensei que eu iria pesar de qualquer maneira uma vez que esta é uma questão que eu recentemente se deparar. Minha recomendação seria a de deixar o seu JAXB classes anotadas sozinho, uma vez que qualquer alteração de esquema exigirá gerando re-essas classes. Ou seja, você terá que re-introduzir quaisquer anotações de hibernação, etc. manualmente. Esta pode ser uma solução pouco fora do prazo de validade, mas eu acho que seria perfeitamente razoável para criar um arquivo de mapeamento de hibernação (.hbm.xml) para abrigar os mapeamentos externamente. Isto é um pouco mais flexível, menos confuso, e tão útil na minha opinião.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top