2016-09-22 36 views
0

我有一個實體類「classA」和一個模型類「ClassA1」。 ClassA用於從服務器端存儲mysql數據庫中的值,ClassA1用於將API響應字符串轉換爲客戶端對象。如何使用java類作爲實體並作爲模型

現在我有兩個具有相同getter和setter的java類,但ClassA包含hibernate註釋,而ClassA1只是一個POJO。考慮下面的類結構

ClassA.java

@Entity 
@Table(name="classA") 
public class ClassA { 
    @Id 
    private int id; 
    private String name; 

    public int getId() { 
     return id 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name="name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

ClassA1.java

public class ClassA1 { 
    private int id; 
    private String name; 

    public int getId() { 
     return id 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

我的申請方含更多的像上面的類號。我想避免這種情況,因爲如果我將任何列添加到我的數據庫中,目前我在ClassA和ClassA1中都添加了getter和setter。

有什麼辦法可以爲服務器端和客戶端模塊使用單一類?

+1

你們倆面臨的問題是什麼? –

+0

如果我使用同一個類,客戶端模型也會加載一個jpa相關的代碼,這真的不是我想要的。 – Achaius

+0

@Achaius加載了哪些JPA相關代碼? –

回答

1

您可以簡單地嘗試在兩種情況下使用相同的類。它應該工作。這是我在早期項目開始時嘗試的方式。只要您可以認真對待您從客戶端收到的ClassA的JPA合併,將其視爲分離的實體。然而,當你的實體設計變得越來越複雜時,你將面臨很多問題(這就是爲什麼我在我的項目中改用這種方法的原因:P)。最大的問題之一是,假設你已經建立了實體關係的模型,一旦你嘗試「序列化」它爲客戶端使用,很多(JAXB等,當時我正在做項目)解決方案將遞歸追蹤所有的關係,並嘗試將其轉換。這種行爲會觸發實體的大量延遲獲取,並使結果序列化形式包含大量(未使用)的數據。儘管您可以控制行爲(通過添加某種忽略註釋等),但結果實體會變得很難維護。

因此,你在做什麼,恕我直言,不是不合理的。你需要小心的是,把值對象(你稱之爲「模型」)看作「演示」。你不需要使它與你的實體嚴格一致。

利用/開發一些util庫來處理來自實體的值對象的構造,並將數據從值對象填充回實體。

當然,這個建議可能不適用於你,因爲你沒有太多分享你的架構。

1

您可以在XML文件中單獨指定您的Hibernate映射,而不是使用註釋。這是做舊的方式,現在大多數人使用註釋,因爲它更方便,並且遵循JPA標準(大部分)。

另一種解決方案是使用像Dozer這樣的bean映射框架來使映射更容易。

在體系結構中分離持久(JPA)實體和視圖使用的值對象是很常見的。您可以自定義使用它們的視圖的值對象。也許視圖不需要完整的用戶實體,但只需要id,名稱和地址?如果是這種情況,它會使視圖和後端之間的通信變得更輕鬆,並部分解決ValueObjects和持久實體之間的重複問題。

相關問題