【问题标题】:Looping through Hibernate many-to-many in JSP在 JSP 中循环通过 Hibernate 多对多
【发布时间】:2012-03-03 19:49:53
【问题描述】:

我在处理 @ManyToMany 关系时遇到了一些问题。我了解使用 @JoinTable 而不是实际创建 ManyToMany 类,这非常简单。

使用这种方法,在 JSP 中循环遍历一个集合非常简单。我从这里复制了我的示例:http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/ 假设我们有一组股票,其中包含一组类别。

<c:forEach var="stock" items="${parentItem.stocks}">
    <div>Stock id: ${stock.id}</div>
    <c:forEach var="category" items="${stock.categories}">
        <div style="padding-left:15px">Category id: ${category.id}</div>
    </c:forEach>
</c:forEach>
Output:
Stock id: 1
    Category id: 1
    Category id: 2
Stock id: 2
    Category id: 1
    Category id: 3
....

我的项目要求我的 ManyToMany 表包含一个自定义列。我的理解是,我需要在代码中定义关联表,而不是。所以现在父项包含一个包含股票和类别的 StocksCategories 集合。因此,根据我的要求并查看这个定义 ManyToMany 表的示例:http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/ 它改变了很多东西。所以现在循环这个变得有点棘手了。

<c:forEach var="currentStockCategory" items="${parentItem.stocksCategories}">
    <div>${currentStockCategory.stock.id}</div>
    <c:forEach var="innerStockCategory" items="${currentStockCategory.stock.stocksCategories}"> // back up the tree
        <div>${innerStockCategory.category.id}</div>
    </c:forEach>
</c:forEach>
Output:
Stock id: 1
    Category id: 1
    Category id: 2
Stock id: 1
    Category id: 1
    Category id: 2
Stock id: 2
    Category id: 1
    Category id: 3
Stock id: 2
    Category id: 1
    Category id: 3
....

如您所见,它正在遍历stockCategories 关联表中的每个条目。我不想要那个,我需要它像第一个那样显示。从技术上讲,类别列表仍然是该股票对象的一部分,但我怎样才能让它在 jsp 中以这种方式显示呢?备份数据库结构的整个想法感觉不对。

我无法查询库存集合并单独存储它,我必须保持它与父对象的连接。

我已经为此奋斗了大约一个星期,因此非常感谢任何帮助!谢谢。

【问题讨论】:

    标签: java database hibernate jsp hibernate-mapping


    【解决方案1】:

    我不明白您在第二个示例中要做什么,您为什么将外部循环的上下文从股票更改为股票类别?如果表映射正确,您所要做的就是遍历内部循环中的第二个关系。

    第一个示例将被这样修改,以适应添加表示连接表的实际实体:

    <c:forEach var="stock" items="${parentItem.stocks}">
        <div>Stock id: ${stock.id}</div>
        <c:forEach var="stockCategory" items="${stock.stocksCategories}">
            <div style="padding-left:15px">Category id: ${stockCategory.category.id}</div>
        </c:forEach>
    </c:forEach>
    

    --

    对于三路连接,为什么不这样做呢?

    <c:forEach var="stockCategory" items="${parentItem.stocksCategories}">
        <div>Stock id: ${stockCategory.stock.id}</div>
        <div style="padding-left:15px">Category id: ${stockCategory.category.id}</div>
    </c:forEach>
    

    【讨论】:

    • 对不起,我搞砸了细节(我会编辑我的问题)。父项不包含股票的集合,它包含 StocksCategories 的集合。我会在编辑时附上一张图片。
    • 感谢您的帮助,但股票可以有多个类别。检查我的第二个代码块的输出。
    • 此解决方案将清除双重显示,但仍无法按我的需要显示。我不敢相信这是不可能的。
    • 所以您想在所有父项中显示股票所属的每个类别,而不仅仅是当前父项?您可以通过在 JSP 循环中添加一些更复杂的逻辑来修复股票 ID 的重复显示。
    • 不只是该父级下的股票和相应类别的股票。如果它需要通过jsp发生,那很好。与手动创建表格相比,通过 @JoinTable 方法完成时,它看起来更加优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多