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