【问题标题】:One to many mapping with many possibilities具有多种可能性的一对多映射
【发布时间】:2011-07-08 19:47:20
【问题描述】:

我正在尝试持久化我的数据,但在想出一个可以正常工作于 hibernate 的架构时遇到了麻烦

我有两个对象:频道和用户。用户与频道相关联,但在许多方面。它可以有 5 种特殊状态(并且可以分配多个)或正常。由于它是多对多关系(一个用户可以在多个频道中,一个频道有多个用户),这个问题变得复杂。

我的想法是有单独的频道和用户表,但有第三个大地图表。这个大地图表看起来像这样

--------------------------------------------------------------------------
| CHANNEL_ID | USER_ID | STATUS1 | STATUS2 | STATUS3 | STATUS4 | STATUS5 |
--------------------------------------------------------------------------
|      5     |    10   |    0    |    1    |    0    |     0   |    0    |
--------------------------------------------------------------------------

请注意,如果新用户加入频道,他们会获得一个新行。但是,如果他们获得新的状态,他们现有的行就会改变。

真正让我困惑的是如何在 Hibernate 中实现类似的东西。我有类似的东西,但我已经玩了这么久(现在 2 天)我什至不知道它做了什么。

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "quackbot_user_map", joinColumns = {
    @JoinColumn(name = "USER_ID")}, inverseJoinColumns = {
    @JoinColumn(name = "STATUS1")}) 
protected Set<UserDAOHb> status1s;
  • 有没有更好的方法来做到这一点?
  • 我是否应该使用表示表的专用地图对象并使用它进行查询?

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    如果您想映射该设计,您需要第三个实体,我将其称为 Participation

    • 一个用户有多个参与;
    • 一个频道有多个参与;
    • 一个参与有一个频道、一个用户和 5 个布尔字段(状态 1 到状态 5)

    但一种更正常(当然也更容易查询)的设计方式是让 Participation 实体只有一个状态,并为每个 User-Channel-Status 元组创建一个 Participation 实例。如果您考虑一下,如果可能的状态数量更大(或根本不固定),这将是唯一可能的映射(据我所知)。

    【讨论】:

    • 如何使用这个 Participation 类只公开一组用户?我需要设置功能齐全(主要是添加和删除),这意味着仅仅包装结果是行不通的
    • 您必须遍历频道的参与并手动构建用户集。但是当然添加和删除是行不通的。任何映射都无法自动执行此操作,因为您必须处理状态。
    • 最终这样做了,它确实同时简化和复杂化了事情,但我解决了它们。至少表模式现在是理智的。感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多