2017-12-26 55 views
0

私はJPA Employeeを持っています。永続エンティティwjichは50個のフィールドを持っています。時々私は50のフィールドすべてをUIに表示するか、時にはそれよりはるかに少ないフィールドを表示する必要があります。EntityオブジェクトまたはPOJOをUIに返しますか?

は私が

アプローチ1と考えることができる2つの方法があります: -

私はUIにEmployeeエンティティを返し続けます。私は返却する必要Employeeの下でどの特定の分野に言及することができます(注釈付き)の方法があります

例: -

私はブラウザにJSONを返す前に、EmployeeクラスからMiddleNameを無視したい場合は、私がします

0 - :

@JsonIgnoreProperties({"MiddleName"}) 
public abstract class EmployeeMixin extends Employee{ 

} 




Employee employee = new Employee(); 
Map<Class<?>, Class<?>> mixinMap = new HashMap<Class<?>, Class<?>>(); 
mixinMap.put(Employee.class, EmployeeMixin.class); 
ObjectMapper mapper = new ObjectMapper(mixinMap); 
return mapper.writeValueAsString(employee); 

アプローチ2以下のような必要な@JsonIgnorePropertiesEmployeeMixinを作成

私は新しいPOJOに5Oフィールドをすべて再入力してUIに戻します。

私の質問は、より良い設計アプローチですか? Entityオブジェクトまたは新しいPojoオブジェクト(Entityから構築)をUIに戻す必要がありますか?

+0

私のアプローチは1いいね。同じフィールドを持つ新しいpojoを作成することは意味がありません。 したがって、アプローチ1を使用し、アノテーションを使用して必須フィールドのみを返します。 – Mahesh

答えて

0

私はあなたが必要とするフィールドの変数セットを持つ各ケースのDTOオブジェクトを作成しますアプローチ3、投影

  • を好むだろう。
  • DTOを適切に入力するために対応するJPQLまたはCriteriaQueryを作成します。あなたはこのテストは

    @Test 
    @Transactional 
    public void test() { 
        Pojo3 pojo3 = new Pojo3(); 
        pojo3.setF1("f1"); 
        pojo3.setF2("f2"); 
        pojo3.setF3("f3");  
        em.persist(pojo3); 
    
        // **NOTE** the full package path to DTO object 
        TypedQuery<Pojo2DTO> tq = em.createQuery(
         "SELECT NEW org.example.jpa.manyfields.Pojo2DTO(p3.id, p3.f1, p3.f2) " 
         + " FROM Pojo3 p3 WHERE p3.id=:id", Pojo2DTO.class); 
        tq.setParameter("id", pojo3.getId()); 
    
        Pojo2DTO pojo2dto = tq.getSingleResult(); 
        log.info("{}, {}, {}", pojo2dto.getId(), pojo2dto.getF1(), pojo2dto.getF2()); 
    
    } 
    
    を示しようJPQLに移入することができ

    @Getter @Setter 
    @AllArgsConstructor // Pojo2DTO(id,f1,f2) 
    public class Pojo2DTO { 
        private Long id; 
        private String f1,f2; 
    } 
    

    のようなフィールドのサブセットでDTOクラスを作ることができます

    @Entity 
    @Getter 
    public class Pojo3 { 
        @Id 
        @GeneratedValue 
        private Long id; 
        @Setter 
        private String f1, f2,f3; 
    } 
    

    ようentityを持つ

+0

しかし、何がアプローチ1に間違っていますか?アプローチ_3では、各要件に固有の複数のDTOを作成する必要があります。 – user3198603

+0

@ user3198603正しく理解していれば、A1のエンティティフィールドに注釈を付けることになります。だから私はあなたが別々に各要件のエンティティに注釈を付ける方法を確認していないのですか? A3はエンティティ自体をそのままにします。しかし、私が誤解した場合、A1でアノテーションをどのように行うのかという簡単な例を提供できますか? – pirho

+0

アプローチ1の下の私のポストの更新を参照してください – user3198603

関連する問題