JAXB Factory для субъектов JPA - PullRequest
1 голос
/ 15 июня 2011

В большинстве моих предыдущих проектов у меня есть две доменные модели, одна с аннотациями JAXB, а другая с аннотациями JPA.Я знаю, что они могут быть объединены в одну модель с обоими аннотациями в одном классе, но по моему опыту компромиссы с этим подходом всегда приходили к выводу, что их нужно разделять.Другим преимуществом отдельного подхода является возможность создавать классы JAXB с XSD и легко связывать их в XSD из других проектов.

В большинстве случаев мне нужны фабричные классы, позволяющие гибко создавать представления JAXB моих сущностей.Например,

public class UserFactory
{
  public UserFactory(User queryUser, String lang)
  {
     this.queryUser=queryUser;
     this.lang=lang;
  }

  public JaxbUser getUser(JpaUser jpaUser)
  {
     JaxbUser jaxbUser = new JaxbUser();

     if(queryUser.isSetId()){jaxbUser.setId(jpaUser.getId());}
     if(queryUser.isSetEmail()){jaxbUser.setEmail(jpaUser.getEmail());}

     if(queryUser.isSetRoles())
     {
       RolesFactory f = new RolesFactory(queryUser.getRoles(),lang);
       jaxbUser.setRoles(f.getRoles(jpaUser.getRoles()));
     }
     return jaxbUser;
  }
}

Я создаю UserFactory с отдельным шаблоном queryUser и желаемым lang для объектов, поддерживающих разные языки.Шаблон проверяется при создании результата для определенных полей или дополнительных фабрик, и результирующий объект создается.Запрос определяется в XML-файле следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<query lang="en">
  <user id="1">
    <roles>
      <role code="code"/>
    </roles>
  </user>
</query>

Благодаря этой методологии у меня есть мощный и гибкий инструмент для создания настраиваемого XML, несмотря на все недостатки поддержки двух моделей предметной области и фабричных классов.Я знаю, что есть много доступных фреймворков или библиотек, о которых я никогда не слышал, поэтому вот мой вопрос:

Есть ли что-то похожее на мой подход?

1 Ответ

0 голосов
/ 15 июня 2011

Есть в основном два варианта:

  • JPA и JAXB аннотации для одних и тех же классов (см. Hyperjaxb3 или DataNucleus )
  • Или вы держите разделенные и пишете код для сопоставления одного на другое

Лично я не вижу большой добавленной стоимости в кросс-модельном коде сопоставления. Использование фабрик также не кажется слишком инновационным, это просто вопрос техники программирования, которую вы используете для отображения одного на другое.

...