Hibernate 如何使用常量作为复合外部引用的一部分

标签 hibernate foreign-keys constants composite

我有一个带有复合主键的主表 A,由 组成两个列。其中一列是 常数 (下面代码中的“常量值”)。此表定义如下所示:

@Entity public class Master {
  @Id
  @Column(name = "SIGNIFICANT_KEY")
  private String realKey;

  @Id
  @Column(name = "CONSTANT_KEY")
  private String constantPartKey;
}

我有一个详细表 B,仅使用 引用主表 A一 (非常量)列。我想在两个表之间实现通常的 ManyToOne 和 OneToMany 关系。

问题:如何使用 Hibernate 处理这种情况?

我发现的唯一主引用解决方案依赖于使用公式:
@Entity public class Detail {
  @ManyToOne
  @JoinColumnsOrFormulas(value={
    @JoinColumnOrFormula(column=
      @JoinColumn(name = "SIGNIFICANT_KEY",
                  referencedColumnName = "SIGNIFICANT_KEY",
                  insertable=false, updatable=false, nullable = false)),
    @JoinColumnOrFormula(formula=
      @JoinFormula(referencedColumnName="CONSTANT_KEY", value="'THE CONSTANT VALUE'"))
  })
  Master master;
}

现在我看到另一个问题:由于我之前在这里报告的 java.lang.ClassCastException 问题,我无法在 OneToMany 关系中使用此字段:https://hibernate.onjira.com/browse/HHH-6811

最佳答案

我真的很想知道在数据库中有一个常量列值会有什么帮助,但无论如何......

我要做的是只将非常量列映射为 ID,并使常量列成为具有常量值的常规列:

@Entity
public class Strange {
    @Id
    private Long id;

    @Column
    private long constant = 345; // the constant that you want in your database

    @OneToMany(mappedBy = "strange")
    private Set<Detail> details;

    ...
    // no setter for constant!
}

@Entity
public class Detail {
   ...
   @ManyToOne
   @JoinColumn(name = "strange_id")
   private Strange strange;
}

如果其他实体使用其完整的复合键引用同一个 Strange 实体,则只需执行以下操作:
@Entity
public class Strange {
    @Id
    @Column(name = "strange_id")
    private Long id;

    @Id
    private long constant = 345; // the constant that you want in your database

    @OneToMany(mappedBy = "strange")
    private Set<Detail> details;

    ...
    // no setter for constant!
}

@Entity
public class Detail {
   ...
   @ManyToOne
   @JoinColumn(name = "strange_id", referencedColumnName = "strange_id")
   private Strange strange;
}

您可以使用其他实体而不是它们的 PK 来引用其他实体。另一个独特的列也可以。并且由于 strong_id 是唯一的,因此它符合要求。 referencedColumnName在这种情况下,必须使用属性来指定引用的列名。

关于Hibernate 如何使用常量作为复合外部引用的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8924928/

相关文章:

java - 对象数据库与经典 MySQL

hibernate - 内连接和内连接 fetch 有什么区别? ,HQL

c# - 如果有的话,我们什么时候应该使用 const?

java - 常数的真正定义是什么?

java - 使用 Spring Data 和 HIbernate JPA 进行延迟加载

java - Struts2 xwork 类型转换与 hibernate

python - 如何在 Django 中连接两个表并在我的模板中使用结果?

mysql - RedBeanPHP 多个 FK 到同一个表

sql-server - SQL - 如何插入外键作为列的值

c++ - 我应该避免循环中常量之间的操作吗?