【问题标题】:Mapping many-to-many without a join table in Hibernate/NHibernate在 Hibernate/NHibernate 中映射多对多而没有连接表
【发布时间】:2010-01-11 16:32:07
【问题描述】:

我有两张桌子:

CalendarEntry
  Id
  Date
  ...

Holiday
  Id
  Date
  ...

在我的CalendarEntry 类中,我有这样的属性

public ISet<Holiday> Holidays { ... }

我想将其与出现在与CalendarEntry 相同的Date 上的Holiday 实例相关联。但是,我想不出如何做到这一点。

我尝试将其映射为一对多,但一对多自动假定它应该使用CalendarEntryId 列执行连接(大概是因为它是唯一保证的属性是唯一的,它必须是一对多的)。

我尝试将其映射为多对多,但似乎多对多需要单独的连接表,在这种情况下我不想要。

我的问题是:是否可以在 NHibernate 中映射它,我应该怎么做?如果不可能,为什么?

【问题讨论】:

  • 您可以发布您尝试使用的映射吗?
  • 我正在使用 NHibernate.Mapping.Attributes,所以我没有 HBM 文件,但我会尝试发布我明天使用的映射。

标签: .net nhibernate orm many-to-many one-to-many


【解决方案1】:

我认为您需要做的是设置查询以获取假日条目。我不确定这是否可以使用映射来完成。


来自我原始答案的附加信息,可能不适用:您可以在 NHibernate 中建立多对多关系,而无需为连接表条目创建单独的实体类,但基础数据仍然需要存在于数据库。

【讨论】:

  • 我不愿意使用连接表部分是因为拒绝修改数据库模式,但主要是因为信息已经存在 - CalendarEntry 和 Holiday 中的日期列 是 i> 实体之间的关联,以及新的连接表似乎是多余的。
  • 是的......不过,这是一个非常松散的耦合,Hibernate 期望它很强大(使用 ID)。我现在将其设置为查询。
【解决方案2】:

您应该能够使用 property-ref 来做到这一点,我相信它在 NHibernate 2.1 中可用。我在 link text 中找到了它,这里是 jira 用于将其添加到 NHibernate。

我不确定这是否适用于日期列,如果您的日期字段包含时间数据,那么您肯定不走运。

您始终可以将关系排除在模型之外,并通过存储库方法访问集合,即 GetHolidaysForDate。这对我来说更有意义,因为假期与日历条目和特定文化不同。除非您使用的非美国含义等同于“假期”。

【讨论】:

    【解决方案3】:

    您可以创建一个数据库视图(或派生表查询),其中包含来自 CalendarEntryHoliday 的适当 ID,然后使用该视图映射多对多关系 - 这在技术上避免了连接表,而允许 NHibernate 以它想要的方式工作。

    您需要确保 NHibernate 不会尝试更新集合(可能是 inverse="true"cascade="none" 的某种组合)并避免在代码中修改它们 - 我认为您对此没问题根本不想要一张桌子。

    【讨论】:

    • 这需要数据库加入 CalendarEntry 和 Holiday 两次,一次用于视图,一次用于获取实际数据。此外,它为查询优化器提供了额外的回旋余地:当使用 oracle 尝试连接两行时,使用 property-refs 映射时使用的嵌套循环连接被替换为视图连接,该连接是使用哈希联接和全表扫描...
    • 如果您特别担心读取性能,可以使用物化/索引视图,但是考虑到问题域,这些表中可能最多有几千行。如果 property-ref 是一个可行的解决方案,它可能是最好的选择,但我之前一直在努力解决它,这是一个很好的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多