2012-04-03 50 views
1

我遇到了一個自己無法解決的問題,因此,我在尋求你的幫助。問題如下: 我們必須升級持久層。以前的項目使用JDBC來訪問數據,但現在它應該使用JPA。這意味着現在數據是在新對象中檢索的,但系統可以與舊對象一起工作。因此,我們應該在舊實體和新實體之間編寫一些轉換器。但問題是,有時從舊的形成新的實體,我們需要一些額外的信息。例如:製作目標轉換器的最佳做法

class OldEntity{ 
    private int id; 
    // old entity contains only foreign key 
    private int otherEntityId; 
    ... 
} 

class NewEntity{ 
    private int id; 
    // new entity contains object that associated with foreign key 
    private OtherEntity otherEntity; 
    ... 
} 

我們希望將一些通用接口添加到所有轉換器,但如果我們從舊實體到新的轉變,首先,我們應該通過ID檢索「otherEntity」,並給它的轉換器。由於我們有很多具有不同結構的實體,轉換器的方法應該接收各種不同的參數以形成新的實體。 問題是:是否有任何針對此類問題的良好體系結構解決方案?

+0

你打算如何獲得更多信息?彈出一個對話框給用戶? – 2012-04-03 03:22:27

+0

不會。它將通過外鍵值從數據庫中檢索。就像例子中的類一樣:我們在舊實體中只有外鍵值,並且希望在新的實體中填充由它的id檢索的整個對象。我認爲在轉換器方法中檢索它是個壞主意,所以,我正在尋找更好的方法將這樣的檢索對象提供給適當的轉換器方法。 – 2012-04-03 03:41:07

+0

您確定沒有辦法配置映射,以便生成舊實體並且不需要轉換器嗎? – 2012-04-03 03:47:54

回答

1

它看起來像Adapter Pattern的工作。您的應用程序期望OldEntities,但持久性現在由NewEntities管理,因此需要一個適配器來管理OldEntities和NewEntities之間的轉換。

然後,您將需要爲您的域模型中的每個實體構建一個適配器。他們應該看起來像這樣:

class NewEntityAdapter extends OldEntity{ 
    private NewEntity newEntity; 

    //This is an overriden method 
    public int getOtherEntityId(){ 
     return newEntity.getOtherEntity().getId(); 

} 
+0

是的。這是一個很好的解決方案,但是當我嘗試向其他方向轉換時出現問題。由於它存儲較少量的信息,很容易從新的實體中獲取舊實體。但是,如果我想從舊形成新的實體,我需要檢索一些其他信息,並將其提供給進行轉換的方法。我認爲在適配器內檢索它並不是一個好主意。 – 2012-04-03 03:56:17

+0

你使用服務層嗎?服務層將是一個很好的地方,可以讓DAO層根據舊實體包含的ID信息獲取NewEntity實例。由於其交易支持,我認爲這是您可以進行此類業務的最佳場所。 – 2012-04-03 04:40:17

+0

當然。所有對話都應該在服務層進行,我可以在那裏檢索所有需求數據。但我認爲它看起來有點混亂,因爲不同的實體具有不同數量的此類附加參數,這些附加參數應該賦予適配器的構造函數或轉換器方法。我不喜歡適配器的方法,因爲它產生了許多額外的類。我的想法是創建具有一些通用界面的轉換器。這裏的問題是如何將這些參數提供給轉換器的方法。其中一個不好但有用的方法是使用Map來獲取其他參數。 – 2012-04-03 07:13:13

1

您可以試試這個。

public interface IBaseEntity{ 

    public int getId(); 

} 

public class OldEntity implements IBaseEntity{ 
    public int getId(){ 
     return id; 
    } 
} 

public class NewEntity{ 
    IBaseEntity entity; 
    public NewEntity(IBaseEntity entity){ 
     this.entity=entity; 
    } 
    public int getId(){ 
     return entity.getId(); 
    } 
} 
+0

謝謝!這是可行的解決方案。但我真的需要轉換器,將轉換邏輯移到實體類之外。 – 2012-04-03 07:00:31