Нужна помощь в проектировании с POJO, используемыми для сервисов JPA и REST Client - PullRequest
1 голос
/ 17 апреля 2011

У меня есть набор JPA POJO, которые содержат аннотации, необходимые для сопоставления с моим доменом. Я также хочу показать некоторые службы REST, которые будут взаимодействовать с этими объектами домена.

Моя текущая задача - создать приложение для Android для доступа к этим службам REST. Я не могу использовать объект домена из-за аннотаций JPA, которые они содержат. Компилятор Dalvik жалуется.

Поэтому я ищу стратегию, позволяющую использовать эти доменные объекты таким образом, чтобы проект Android также мог использовать эти объекты и не должен был дублировать эти POJO.

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Предложение Виктора экстернализовать отображения JPA в XML, а не использовать аннотации, безусловно, сработает, но может быть неудобно, если вы получаете объекты JPA из инструментов, которые генерируют только аннотации.

Я предполагаю, что вам нужнона стороне клиента Java-классы, которые соответствуют объектам, которые вы сериализуете в своих REST-сервисах.

Возможно, но очень утомительно создавать объекты DTO - POJO, точно соответствующие объектам JPA с подходящими конструкторами из объектов JPA,Это кажется излишним усилием.

Должна быть возможность написать процессор исходного кода для удаления аннотаций из Java.Я не думаю, что будет работать простое решение для сценариев регулярных выражений, я думаю, что действительно необходим синтаксический анализ исходного кода, поэтому я не решаюсь предположить, сколько это будет работать.Однако согласно ответам на этот вопрос доступен базовый набор инструментов.Я бы начал с такого подхода.

0 голосов
/ 08 августа 2011

Я мог бы поработать со следующей стратегией.
Эта стратегия работает очень хорошо, когда вы не хотите получать целую коллекцию или получать с некоторыми критериями сложения, вы можете получить ее (отношение к коллекции) с помощью именованного запроса.используйте отдельную операцию DAO для операции CRUD в таблице JOIN с отношением «многие ко многим», например, у пользователя может быть много учетных записей, и учетная запись может совместно использоваться многими пользователями.создать доменные модели / DAO для всех трех таблиц, использовать сопоставление отношений для простого извлечения, а для DDL использовать отдельные свойства.



    @Entity
    @Table(name="account" )
    public class Account {
     @Id (name="accountid")
     private Long accountId;

     @Column
     private String type;

     // removed @OneToMany as it causes issue while serializing to xml
     @Transient
     private Collection accountUsers;  

      //rest of the properties n geter setter goes here
    } 

    @Entity
    @Table(name="user")
    public class User {

     @Id(name="userid")
     private Long userId;

     @Column
     private String name;
      // by making transient jpa / hibernate does not initialize it with proxy.. so it remains null
    /* you can populate this property using named query whenever  required .*/
     @Transient
     private Collection userAccounts; 

   // rest of the properties n getter setter goes here

    }

    @Entity
    @Table(name="AccountUser")
    public class AccountUser {
    // whatever your strategy to implement primary key here , 
    @Id (name="accountuserid")
    private Long accountUserId; 

   /* please note this annotation , made insertable/updatable  false , relation defined just for fetching relation
   */
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "accountid", referencedColumnName = "accountid", insertable = false, updatable = false)
    private Account account;

// look at insertable / updatable properties its turned off
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "userid", referencedColumnName = "userid", insertable = false, updatable = false)
    private User user;

 // 
    @Column ( name = "userid"  )
    private Long userId;

    @Column ( name = "accountid"  )
    private Long accountId;

    @Column ( name="opendate") 
    private Date opendate;

    }

    /* use separate dao to save above beans */
    // somthing like this
    public class AccountDAOImpl extends GenericDAOImpl implements AccountDAO {
    }

    public class UserDAOImpl extends GenericDAOImpl implements UserDAO {
    }

    public class AccountUserDAOImpl extends GenericDAOImpl implements AccountUserDAO {
    }

Я попытался объяснить, если потребуется какое-либо разъяснение, любезно вернуться назад.спасибо

...