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

时间:2012-01-19 11:01:32

标签: 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

1 个答案:

答案 0 :(得分:3)

我真的很想知道在数据库中拥有一个常量列值是多么有用,但无论如何......

我要做的是只将非常量列映射为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以外的其他实体引用其他实体。另一个独特的专栏也行。而且由于strange_id是独一无二的,它符合要求。在这种情况下,必须使用referencedColumnName属性来指定引用的列名称。