更新時間:2022-08-09 10:31:00 來源:動力節點 瀏覽1138次
該概念面向希望利用 IS 7 持久對象層(數據層)創建新持久對象或重用現有對象的開發人員.在處理持久對象開發之前,Intershop建議熟悉 Enfinity 定義語言、EDL 建模和業務對象開發。
由磁帶編碼的功能通常需要在數據庫中持久存儲信息。如果不存在合適的數據庫表,則必須創建新表。為了使管道等應用程序組件可以訪問這些數據庫表,需要在持久層創建新的持久對象。可能還需要實現額外的管理器類,這些管理器類對新的持久對象進行操作。
持久對象 (PO) 是用于將數據存儲到數據庫或從數據庫讀取數據的 Java 對象。采購訂單由四個(可選五個)文件組成:
表示持久對象的 PO 類 各個類都帶有后綴PO,例如ProductPO.java.
描述對象-關系映射(OR 映射)的描述符文件 描述符文件的文件擴展名為*.orm,例如ProductPO.orm.
用于生命周期管理的工廠類各個類都帶有后綴POFactory,例如ProductPOFactory.java.
用于標識持久對象的關鍵類 各個類都帶有后綴POKey,例如ProductPOKey.java.
如果模型定義了一個 key 一個備用 key-class相應的類帶有后綴POAlternateKey,例如. .Preference DefinitionPOAlternateKeyjava
這些類通常是墨盒內部封裝的一部分,不會公開。除了這個抽象基類的持久對象可能參與公共 API。
將類映射到表在 Intershop 7 中,單個 PO 映射到單個表或數據庫視圖。Intershop 7 中未使用其他可能性,例如將類映射到連接表或其他結構。PO 的每個實例對應于一行。類的屬性對應于列。類的主鍵屬性映射到表的主鍵,即用于唯一標識行的列(或列)。
映射和繼承關系Intershop 7 使用一種方法,根據這種方法,只有葉類映射到數據庫中,而超類必須是抽象的。葉類的表既包含從超類繼承的屬性,也包含它們自己的屬性。
Intershop 7 中的許多 PO 派生自通用基類RegionalSettingsPOor ExtensibleObjectsPO,它們都是 com.intershop.beehive.core.capi.domain 的一部分。PersistentObjectPO自動提供一系列屬性,確保以與 Intershop 7 機制和流程兼容的方式定義這些屬性。自動提供的屬性 RegionalSettingsPO包括:
AUUID作為主鍵
樂觀控制屬性 ( oca)
domainID屬性
這是用于引用持久對象所屬域的外鍵屬性。派生自的類 RegionalSettingsPO自動繼承獲取和設置 的domainID方法,以及獲取和設置 . 引用的持久對象的域實例的方法domainID。
域getDomain ()
void setDomain (Domain aDomain)
String getDomainID ()
void setDomainID (String aDomainID)
此外,ExtensibleObjectPO(的子類RegionalSettingsPO)提供了允許開發人員在運行時添加自定義屬性的功能,如參考 - 持久對象的屬性 - 可擴展對象屬性中所述。
以下 EDL 片段定義了一個持久對象,包括與其他對象的依賴關系。
命名空間 com.intershop.training.bc_warehouse.internal
{
orm類 WarehousePO 擴展 ExtensibleObjectPO 實現 Warehouse
{
索引(地址ID);
屬性名: string< 256 > 必填;
屬性位置:字符串< 256 >;
屬性容量: int ;
屬性描述:字符串本地化;
屬性地址ID:uuid;
依賴地址:地址處理程序“com.intershop.beehive.core.capi.profile.ProfileMgr”
{
外鍵(addressID);
}
關系 stockItemPOs : StockPO[ 0. .n] 逆倉庫PO實現stockItems;
}
}
通常,您的對象模型由一組不獨立的 PO 組成,而是以各種方式連接。在對象模型中,類之間的這些連接被建模為關系或依賴關系。
以下部分更詳細地描述了關系的所有方面。
Intershop 7 基于兩種基本的關系類型:
關系
關系表示類之間的雙向語義連接。
以下 EDL 片段定義了兩個對象WarehousePO和StockPO. 側邊的關系定義WarehousePO:
關系 stockItemPOs : StockPO[ 0. .n]
逆倉庫PO實現stockItems;
側面關系定義StockPO:
關系倉庫PO: WarehousePO[ 1. . 1 ]
反向 stockItemPOs 實現倉庫
{
外鍵(倉庫ID) -> (UUID);
}
依賴關系
依賴關系表示類之間的單向關系。在這種情況下,“單向”意味著該關系只能在一個方向上導航。依賴關系通常用于在不同磁帶的持久類之間建立關系。
以下 EDL 片段(來自WarehousePO)對連接WarehousePO和Address. 它表示我們只能從WarehousePOto導航關系,而Address不是相反。
依賴地址:地址處理程序
“com.intershop.beehive.core....
capi.profile.ProfileMgr”
{
外鍵(addressID);
}
與關系相比,依賴關系在內部以非常不同的方式處理。依賴項未在 ORM 部署描述符文件中注冊,它們不需要重新創建引用的類。因此,依賴關系可用于將自定義 PO 類鏈接到 Intershop 7 提供的 CAPI 對象(例如Product)。
根據關系每一方的多重性類型,通常區分三種基本類型的關系:
一對一
允許 [0..1] 到 [1..1];[1..1] 到 [0..1] 和 [0..1] 到 [0..1]。由于雞或蛋的困境,禁止 [1..1] 到 [1..1] 的關系。
一對多
允許 [1..1] 到 [0..n] 和 [0..1] 到 [0..n]。而 [0..1] 到 [1..n] 不是一個實際已知的用例。
多對多
多對多關系總是需要一個連接表來進行映射。
對于關系,多重性在定義中聲明。對于依賴項,多重性僅由代碼間接定義
1)一對多關系
一對多關系在關系數據庫設計中很常見,允許以經濟的方式表示復雜的數據集。例如,每個 WarehousePO 實例都指向屬于它的 StockPO 實例。同樣,每個StockPO指向它的WarehousePO.
為了將倉庫和庫存數據關聯起來,表中需要一個特殊的列,為每個實例StockPO標識正確的實例。這個特殊的列作為外鍵,它通常映射到相關表的主鍵,在我們的例子中,表。WarehousePOStockPOWarehousePO回到關系的表示,這意味著您必須引入一個特殊的屬性,該屬性用作外鍵并映射到相關 PO 類的主鍵屬性上。在一對多關系中,外鍵在類中定義多面, 例如, StockPO, 它映射到類的主鍵上一邊,例如,WarehousePO。
EDL 片段來自多面,例如StockPO:
索引(倉庫ID);
屬性warehouseID: uuid 必填 只讀;
關系倉庫PO: WarehousePO[ 1. . 1 ] 逆stockItemPOs實現倉庫
{
外鍵(倉庫ID) -> (UUID);
}
對于一對多關系,代碼生成器為所涉及的兩個類創建特殊方法,多面和上的課一邊. 方法因所考慮的類別而異。
多端方法
為類生成的方法多面,例如,StockPO允許您訪問代表類的角色一邊,例如,WarehousePO。
public WarehousePO getWarehousePO ()
單方面的
方法一邊,例如,WarehousePO代碼生成器創建一個方法來訪問代表類的相關角色多面,例如StockPO:
公共集合getStockItemPOs ()
公共迭代器createStockItemPOsIterator ()
此外,代碼生成器創建關系包裝器方法。這些方法檢查特定元素是否參與關系:
public boolean isInStockItemPOs (StockPO anElement)
public int getStockItemPOsCount ()
2)依賴
依賴關系是與實現的類的單向關系PersistentObject。單向意味著它們只能在一個方向上遍歷:從源類到目標類。目標類總是有多個0..1. 在下面的 EDL 片段WarehousePO中,依賴關系表示 的每個實例WarehousePO都與 的一個實例相關聯Address。與正常的關聯關系相反,依賴關系沒有表達相反的陳述,即每個實例Address都可以與一個或多個實例相關聯WarehousePO。Address不知道兩個實體之間的存在和WarehousePO 關系。但是,如果業務邏輯需要此功能,則可以確定所有實例WarehousePO通過使用查詢與給定地址相關。結果可能包含許多實例或僅包含一個實例,如果這受到實現的限制。因此,依賴于實現,依賴關系可以是一對多或一對一的關系。
依賴地址:地址處理程序“com.intershop.beehive.core.capi.profile.ProfileMgr”
{
外鍵(addressID);
}
代碼生成器為依賴項創建的代碼只影響源類,而不影響目標類。Address因此,如果您創建的新 PO 與無法重新編譯或更改的現有對象(例如 )相結合,則依賴關系特別有用。
另一個常見的用例是隱藏與單側 PO位于同一墨盒中的 PO 的關系,因為它不打算使該 PO 的這種關系“公開”。在這種情況下,不能定義處理程序,并且調用 PO 的工廠以通過主鍵查找來定位相關實例。另一個用例是避免創建與海量數據的雙向關系。
以下 EDL 片段WarehousePO聲明了外鍵屬性addressID:
屬性地址ID:uuid;
索引(地址ID);
通常,依賴項將自定義 PO 與由 CAPI 接口表示的其他持久對象連接起來。
在我們的示例中,依賴項將自定義 POWarehousePO與標準 Intershop 7 CAPI 接口連接起來Address。在對這樣的依賴項進行建模時,您必須提供管理器的符號名稱,該管理器提供對 CAPI 接口后面對象的訪問。
代碼生成器使用提供的管理器來創建訪問器方法。
代碼生成器創建一個 getter 方法,它允許您訪問特定源類實例所連接到的目標類實例,以及一個用于將源實例分配給目標實例的 setter 方法。例如,對于與 連接的依賴WarehousePO,Address生成如下方法:
公共地址getAddress ()
{
if (getAddressIDNull())
{
返回 空值;
}
ProfileMgr 工廠 = (ProfileMgr) NamingMgr.getInstance().lookupManager(ProfileMgr.REGISTRY_NAME);
return (Address) factory.resolveAddressFromID(getAddressID());
}
public void setAddress (地址地址)
{
if (address == null )
{
setAddressIDNull( true );
}
別的
{
setAddressID(address.getUUID());
}
}
3)多對多關系
多對多關系在 Intershop 7 應用程序中很常見。例如,考慮產品和供應商之間的關系:每個供應商可能交付不止一種產品,而每種產品可能由不止一個供應商交付。或者,組合產品以形成新產品(例如,計算機、鼠標和監視器)的產品捆綁包可以捆綁成完整的計算機包。這里也存在多對多關系,因為每個產品包可以包含許多不同的產品,并且每個產品都可以是不同產品包的一部分。
考慮下圖,它表達了產品和產品包(同樣是產品)之間的關系。通過 assignment class ,通過將(引用產品捆綁包的 UUID 的外鍵屬性)的值與(引用捆綁包中的產品的外鍵屬性)的值BundleAssignmentPO配對,產品捆綁包與產品配對。兩個外鍵都映射到( ) 的主鍵。bundleIDproductIDProductUUID
在許多用例中,持久對象實現了 CAPI 接口。該接口也可以建模或作為外部類型導入。以下 EDL 片段中顯示了在自定義 PO 之上建模的一組 CAPI 接口的示例:
導入 “enfinity:/demo/edl/com/intershop/demo/capi/Warehouse.edl”;
命名空間 com.intershop.demo.internal
{
orm class WarehousePO extends ExtensibleObjectPO implements Warehouse { ... }
}
導入 “enfinity:/demo/edl/com/intershop/demo/capi/Stock.edl”;
命名空間 com.intershop.demo.internal
{
oca orm class StockPO 實現 Stock { ... }
}
PO WarehousePO 實現了接口Warehouse。
PO StockPO 實現了 Stock 接口。
接口是 capi 包的一部分,而實現類是內部包的一部分。
請注意,PO 和接口使用不同的基類:
PO WarehousePO 繼承自抽象類com.intershop.beehive.core.capi.domain.ExtensibleObjectPO。
接口 Warehouse 擴展了接口com.intershop.beehive.core.capi.domain.ExtensibleObject。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習