2011-12-11 62 views
2

我剛開始使用OrmLite,所以我正在玩它。我無法理解一些概念,尤其是。處理多對多的關係。如何使用ormlite以多對多的關係檢索整個數據集?

這是我的主表:

Pc 
    Name 
    Domain 
Ethernet 
    IP 
    Gateway 
    Subnet 
    MAC 

而這裏的人,確保許多一對多關係,就像在網上-例如:

PcEth 

我通過填充數據庫:

PC somePc = new PC("randomPc", "someDomain"); 
    pcDao.create(somePc); 

    Ethernet eth1 = new Ethernet("127.255.0.1", "255.0.0.0", "192.168.1.1", "macadress"); 
    Ethernet eth2 = new Ethernet("192.168.1.1", "255.0.0.0", "192.168.1.1", "macadress"); 
    ethernetDao.create(eth1); 
    ethernetDao.create(eth2); 

    pcEthernetDao.create(new PcEthernet(somePc, eth1)); 

但我很不確定我如何讓屬於PC的所有數據都回來。我有點期待

PC pc = pcDao.queryForId(1); 

自動檢索其他表的數據。這不就是ORM應該做什麼嗎?有一個對象,所以我不需要關心底層數據庫?然而,我所得到的只是Pc.object,它只有PC定義的屬性。 (在另一方面,它不是奇怪,因爲我只處理上pcDao。)

然而,我怎麼建立一個查詢,使我得到一個「元對象」包含所有數據屬於PC?一個包含PC數據的對象,以及屬於PC的以太網設備列表(也包括它們自己的Dns地址列表)以及軟件和操作系統列表。

我現在應該手動解決依賴關係嗎?查詢Pc,請求PcEthernet-table獲得匹配的Ids,檢索EthernetDevice,等等?

還是有一招我還沒有抓到呢?

回答

3

@ Emmanuel的回答很好,但我想我會添加一些上下文。他是正確的,你將需要至少管理自己的一些關係。

這不就是ORM應該做什麼嗎?

是的,雖然ORMLite一直在打擊「尺寸與功能集」戰爭。它的設計和構建是一個「精簡版」的ORM,爲此目的,它將不會支持完整的ORM功能,如Hibernate或iBatis的功能從不支持

ORMLite可以做什麼以及您的數據集在您的PcEthernet對象中都有(如@Emmanuel所述)@ForeignCollectionField

public class Pc { 
    @DatabaseField(generatedId = true) 
    private long id; 
    @ForeignCollectionField 
    private ForeignCollection<PcEthernet> pcEthernets; 
    ... 
} 

當您檢索Pc,一個單獨的查詢將填補pcEthernets。但是,您需要執行查詢以自行獲取關聯的Ethernet對象。

以前有請求自動生成連接表並自動執行IN查詢。如果你想概述它如何工作或協助開發,一定要加入ORMLite developers mailing list

最後,在這種情況下,你是否真的需要一個多對多的關係? Ethernet對象不只有一個Pc對象嗎?

3

您可以查看ormlite存儲庫中的many-to-many example

在他們的例子中,他們有表User,PostUserPost。因此,他們使用一個對象來表示連接表UserPost並使用它查詢關係。沒有魔法。

也許你可以在你的m2m關係的兩邊使用@ForeignCollectionField註解自動填充外來對象。

+0

因此,在處理n對m關係時,似乎我必須構建自己的getAllMfrom(N)和getAllNfrom(M)方法。我想知道它是否會更通用一些。 – k0pernikus

相關問題