【问题标题】:How to retrieve objects from a MySQL Database with a many-to-many relationship?如何从具有多对多关系的 MySQL 数据库中检索对象?
【发布时间】:2012-02-24 08:27:54
【问题描述】:

我有 2 个表:DocumentCategory 具有多对多关系。此外,该关系还有一个名为weight 的属性。 我也有相应的类,其中 Document 表示如下:

public class Document {
    private Integer id; // Id from DB, 0 if new object
    private String name;
    private String url;
    private Date dateCreated;
    private List<Category> categories;

    // getters & setters...
    }

现在我有 2 个问题 - 特别关注最佳实践。 我想从数据库(MySQL)中检索数据并构建我的对象。我使用这样的 SELECT 语句:

SELECT doc.*, GROUP_CONCAT(cat.CategoryID SEPARATOR ',') AS CategoryGrp FROM document doc
LEFT JOIN doc_category dc ON doc.Doc_ID = dc.DC_DocID
LEFT JOIN category cat ON dc.DC_CategoryID = cat.CategoryID
GROUP BY doc.Doc_ID

在结果集中,rs.getString(5) --> CategoryGrp 将具有相关类别的 ID。现在我如何通过根据类的需要链接它的类别来继续构建我的对象文档。

我倾向于在表 Category 上执行新的 SELECT 请求,以便在第一个 ResultSet 上循环获取其他详细信息(例如类别名称)。 这是一个好习惯吗?没有“推荐”的方式吗?

我的第二个问题是关于联结表中的属性 weight。我应该在哪个对象中记录它的值?我猜它是 Category 但不太确定,因为 Category 对象本身不能有 weight...

希望我已经足够清楚了。 谢谢

【问题讨论】:

    标签: java mysql oop


    【解决方案1】:

    第一个问题的答案: 2种方式:一个sql或像你建议的2个sql。 (检索文档并为每个猫 ID 执行 sql 以检索猫属性) 我认为这更好: 获取具有不同猫及其属性的所有文档。循环它并将文档与前一个文档进行比较。如果不同,那么您有一个新的 doc 对象。循环中的每一行都是不同的 cat 对象。

    doc1 cat1
    doc1 cat2
    doc1 cat3
    doc2 cat4
    doc3 cat5
    doc3 cat6
    ... 
    

    第二个问题的答案: 我认为您应该考虑这一点:体重与 doc 还是 cat 更相关?另一方面,你不能在 1 个文档上拥有多个权重,所以我的猜测是添加到 cat (因为这是一对一的关系。

    【讨论】:

    • 谢谢!我想避免所有这些循环的最好方法是使用 ORM 工具?
    • 是的,你可以使用 Hibernate,它会为你“做”循环 :)
    【解决方案2】:

    RDBMS 中的多对多关系总是由至少 3 个表完成。因此,您需要第三张表,其中将包含前两张的 ID,您的所有 SELECT-s 都将通过第三张表。

    【讨论】:

    • 我已经有第三张桌子了。我的问题是一种高效 方式来检索数据并创建我的Java 对象 并仍然保持关系。我不需要 3 个类来做到这一点:只是一个复合/对象属性:类别 - 这是我创建的一个类 - 在类文档中。看看我的课堂文档...
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多