使用ORMLite实现多对多关系的最佳方法是什么?

19

我目前正在使用ORMlite来创建关于表格和关系的模型。其中一个关系是多对多的关系。那么怎样实现最佳呢?

更具体地说:

假设我有这两个表格:

Product
   id
   brand

Purchase
   id

一个购买可以包含多个产品,而一个产品也可以在多个购买中被使用。 使用ORMLite,我可以在每个模型中使用@ForeignCollectionField,但我认为这样做行不通。 我唯一看到的有效解决方案是创建第三张表Product_Purchase,以建立Product和Purchase之间的多对一关系。

你们觉得呢?

3个回答

27

@Romain的自我回答是正确的,但这里还有一些更多的信息供后人参考。正如他所提到的,有一个示例使用ORMLite的多对多项目,演示了最好的方法:

http://ormlite.com/docs/example-many

该示例使用一个连接表来存储两个对象的id以建立关系。在@Romain的问题中,连接对象将同时包含ProductPurchase对象。类似于:

public class ProductPurchase {
    @DatabaseField(generatedId = true)
    private int id;
    @DatabaseField(foreign = true)
    private Product product;
    @DatabaseField(foreign = true)
    private Purchase purchase;
    ...
}

从对象中提取id字段,创建一个类似以下表格:

CREATE TABLE `userpost` (`id` INTEGER AUTO_INCREMENT , `user_id` INTEGER ,
    `post_id` INTEGER , PRIMARY KEY (`id`) ) 

然后您可以使用内部查询来查找与每个Purchase相关联的Product对象,反之亦然。有关详细信息,请参见示例项目中的lookupPostsForUser()方法。

虽然已经考虑过并设计了自动处理此类情况的方法,但现在ORMLite仅在内部处理一对多关系。


好的,非常感谢Gray!我只是想确认一下,你解释得很清楚。 - Romain Piel
1
谢谢你的回答,但是Gray,这个事实真的记录得非常不好。对于想要使用ORMLite的大型Android应用程序来说并不好。 - eento
你能更具体一些吗,@eento?你能写一些更好的文档吗? - Gray
lookupPostsForUser() 在这里:https://github.com/j256/ormlite-jdbc/blob/85ea5b40fb2674a57eb81329597bb1e67c326a9c/src/test/java/com/j256/ormlite/examples/manytomany/ManyToManyMain.java - Parampal Pooni
1
我理解这个代码是为什么和如何运行的。不过这会改变数据的表达方式。难道一个购买订单不应该有一个包含产品(List<>)的集合,而产品则应该有一个包含它们所属的购买订单的集合吗? - Rauter

6

好的,我想唯一的方法就是创建第三个表Product_Purchase。这在示例项目中已经指示。


-1
你需要创建一个ProductPurchase类,并像另一个对象一样管理它,使其进入你的数据库。
你可以(但不必)在购买中拥有产品集合(反之亦然),但当你从ProductPurchase链接表中加载产品和购买之间的关系时,它们将必须手动更新/创建。这些集合对ORM没有任何意义(您不会也不应该对它们进行注释)。
如果有人正在寻找一个具有多对多关系的Android应用程序,我制作了一个示例:https://github.com/arthurrauter/ormlite-android

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接