如何使用ormlite检索多对多关系中的整个数据集?

时间:2011-12-11 14:52:09

标签: java sqlite 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数据的对象,以及属于Pcs的ethernetDevices列表(包括他们自己的Dns-adresses列表),以及软件和操作系统列表。

我现在应该手动解决依赖关系吗?查询一个Pc,要求PcEthernet表获取匹配的ID,检索EthernetDevice,等等?

还是有一个技巧我还没有抓到呢?

2 个答案:

答案 0 :(得分:3)

您可以查看ormlite存储库中的many-to-many example

在他们的示例中,他们有表UserPostUserPost。因此,他们使用一个对象来表示连接表UserPost并使用它来查询关系。没有魔力。

也许你可以在m2m关系的两边使用@ForeignCollectionField注释来自动填充外来对象。

答案 1 :(得分:3)

@ Emmanuel的答案很好,但我想我会添加一些背景信息。他是正确的,你需要自己管理至少一些这种关系。

  

这不是ORM应该做的吗?

是的,虽然ORMLite一直在与“规模与特征集”战争作斗争。它被设计和构建为“Lite”ORM,为此它永远不会支持Hibernate或iBatis等完整的ORM功能。

您可以使用ORMLite和您的数据集执行的操作,如@Emmanuel所述,@ForeignCollectionFieldPc对象中都有Ethernet

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

当您检索Pc时,单独的查询将填入pcEthernets。但是,您需要执行查询以自行获取关联的Ethernet对象。

之前有过请求自动生成连接表并自动执行IN查询。如果您想概述它如何工作或协助开发,请务必加入ORMLite developers mailing list

最后,在这种情况下,你真的需要一个多对多的关系吗? Ethernet对象不只有一个Pc对象吗?