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

Posted

技术标签:

【中文标题】使用 ORMLite 实现多对多关系的最佳方法是啥?【英文标题】:What is the best way to implement many-to-many relationships using ORMLite?使用 ORMLite 实现多对多关系的最佳方法是什么? 【发布时间】:2012-02-28 19:38:38 【问题描述】:

我目前正在使用 ORMlite 来制作包含表格和关系的模型。 一种关系是多对多关系。实现它的最佳方式是什么?

更具体一点:

假设我有这两张表

Product
   id
   brand

Purchase
   id

一次购买可以有多个产品,一个产品可以在多个购买中。 使用 ORMLite,我可以在每个模型中都有一个 @ForeignCollectionField,但我认为它不会起作用。 我看到的唯一有效解决方案是制作第三个表 Product_Purchase 以将 Product 和 Purchase 与多对一关系联系起来。

大家怎么看?

【问题讨论】:

【参考方案1】:

@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,这个事实的文档记录真的很差。对于想要使用 ORMLite 的大型 android 应用程序来说并不好。。 你能更具体点@eento 吗?你能写一些更好的文档吗? lookupPostsForUser() 在这里:github.com/j256/ormlite-jdbc/blob/… 我理解它为什么以及如何工作。但是,这会改变数据的表示。购买不应该有一个产品集合(列表)并且产品有一个它们所属的购买集合吗?【参考方案2】:

好的,我想唯一的方法是创建第三个表 Product_Purchase。 它在sample project 中指明。

【讨论】:

【参考方案3】:

您必须创建一个 ProductPurchase 类并像管理另一个必须进入数据库的对象一样管理它。

您可以(但您不必)在 Purchases 中拥有一组产品(反之亦然),但是当您从 ProductPurchase 链接器加载产品和购买之间的关系时,必须手动更新/创建它们桌子。拥有这些集合对 ORM 没有任何意义(您不会也不应该对它们进行注释)。

如果有人正在寻找具有多对多关系的 Android 应用程序,我做了一个示例: https://github.com/arthurrauter/ormlite-android

【讨论】:

以上是关于使用 ORMLite 实现多对多关系的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中存储一对多或多对多关系的最佳方式是啥?

创建“多对多”关系的常用方法是啥?

在 Doctrine 中创建多对多关系的最佳实践。

思考具有两个外键的一对多或多对多关系的正确方法是啥?

实体框架代码优先的多对多关系的最佳方法

在 NHibernate 中定义多对多关系以允许删除但避免重复记录的正确方法是啥