我刚刚开始使用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,等等?
还是有一个技巧我还没有抓到呢?
答案 0 :(得分:3)
您可以查看ormlite存储库中的many-to-many example。
在他们的示例中,他们有表User
,Post
和UserPost
。因此,他们使用一个对象来表示连接表UserPost
并使用它来查询关系。没有魔力。
也许你可以在m2m关系的两边使用@ForeignCollectionField注释来自动填充外来对象。
答案 1 :(得分:3)
这不是ORM应该做的吗?
是的,虽然ORMLite一直在与“规模与特征集”战争作斗争。它被设计和构建为“Lite”ORM,为此它永远不会支持Hibernate或iBatis等完整的ORM功能。
您可以使用ORMLite和您的数据集执行的操作,如@Emmanuel所述,@ForeignCollectionField
和Pc
对象中都有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
对象吗?