【问题标题】:Hibernate: Many-to-one using FormulaHibernate:使用公式的多对一
【发布时间】:2010-02-25 14:32:52
【问题描述】:

希望有人能帮我找到答案。

我正在使用旧数据库,我无法更改任何预先存在的表,因为其他应用程序依赖于它们。

我有三个主要的现有表:A、B、C

A 有一个参考 B 的列(多对一关系)。问题是它应该与 C 而不是 B 有关系。所以我创建了一个 *-1 映射 BC。

Tables: A,B,C,BC (all have ID field)
A-B many to one
B-C many to one through BC
Needed:A-C without altering A,B or C

我不想为 B 或 BC 提供 java 实体,只需要 A 和 C,并且 A 应该有一个字段 A.c

到目前为止,我尝试使用 @Formula 注释无济于事。

class A{
  @ManyToOne
  @Formula(value="select BC.c from BC where BC.b = b")
  private C c;
}

这会产生以下 SQL:

select this_.c_ID from A this_

显然失败了,因为表 A 中没有 c_ID 列(为什么公式被完全忽略?)。

删除@ManyToOne 注释会产生:

select (select BC.c from BC where BC.b = this_.b) as formula_0 from A this_

这将是完美的,除了 Hibernate 需要一个 BINARY 值(类 C 的序列化?)并在转换它接收的 Integer 时抛出异常。

这个 ID 对于延迟加载应该足够了,但是我如何告诉它这样做呢? @ManyToOne 的任何使用都会破坏公式。

如何在不更改 A、B、C 表或创建 Java 类 B 或 BC 的情况下实现 A-C 链接?

感谢您提供任何信息, 丹

【问题讨论】:

    标签: java hibernate formula annotations many-to-one


    【解决方案1】:

    听起来很像bug,不幸的是没有准备好使用注释的修复,但似乎你可以使用这些类的 xml 映射文件。

    【讨论】:

    • 是的,你是对的,这似乎是同样的问题。我真的很想将所有映射保留在注释中。现在我已经添加了 B 和 BC 类,但我可能会更改为仅针对此类的 xml 映射,因为它会更有效。
    【解决方案2】:

    这应该在 Hibernate 3.5.0-Beta-2+ 中工作(HHH-4382 已修复)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多