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

Hibernate如何使用常量作为复合外部引用的一部分,hibernate,foreign-keys,constants,composite,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; } @Entity public class St

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

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

  @Id
  @Column(name = "CONSTANT_KEY")
  private String constantPartKey;
}
@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;
}
我有一个明细表B,只使用一个(非常量)列引用主表a。我想在两个表之间实现通常的manytone和OneToMany关系

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

我找到的主参考的唯一解决方案依赖于使用公式:


现在我看到了另一个问题:由于我在前面报告的java.lang.ClassCastException问题,我无法在OneToMany关系中使用此字段:

我真的想知道在数据库中使用常量列值有什么帮助,但无论如何

我要做的是只将非常量列映射为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;
}
@实体
公共类奇怪{
@身份证
私人长id;
@纵队
private long constant=345;//数据库中所需的常量
@OneToMany(mappedBy=“奇怪”)
私人设置详情;
...
//没有一个始终如一的人!
}
@实体
公共类详细信息{
...
@许多酮
@JoinColumn(name=“奇怪的\u id”)
私人陌生陌生;
}
如果其他实体使用其完整复合键引用同一奇怪实体,则只需执行以下操作:

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

  @Id
  @Column(name = "CONSTANT_KEY")
  private String constantPartKey;
}
@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;
}
@实体
公共类奇怪{
@身份证
@列(name=“奇怪的id”)
私人长id;
@身份证
private long constant=345;//数据库中所需的常量
@OneToMany(mappedBy=“奇怪”)
私人设置详情;
...
//没有一个始终如一的人!
}
@实体
公共类详细信息{
...
@许多酮
@JoinColumn(name=“奇怪的id”,referencedColumnName=“奇怪的id”)
私人陌生陌生;
}

您可以使用PK以外的内容引用其他实体。另一个独特的列也可以。而且因为奇怪的id是独一无二的,所以它符合要求。在这种情况下,必须使用
referencedColumnName
属性指定引用的列名。

主键如何由常量列组成?在您描述的情况下,“real”键是复合键的非常量列。@James DW具体的遗留应用程序对键的第二部分使用常量值。同一个应用程序拥有依赖于此“功能”的详细信息表不,我有不同的情况。我的数据库是遗留数据库,因此无法更改模式。主表有两个包含主键的实列。从这两列中,第二列总是具有相同的值。我从来没有告诉过您更改模式。我刚刚告诉过您,只将复合PK的变量列映射为实体的ID。因为另一列从不更改,所以它是否是实体ID的一部分并不重要。不,我有一个不同的情况。我的数据库是遗留数据库,因此无法更改模式。主表有两个包含主键的实列。从这两列中,第二列始终具有相同的值。明细表只有一列指向主表。如果是两列,我会使用@ManyToOne和@JoinColumns符号列出这两列。我必须使用一些东西来代替缺少的列。而且,我不能仅仅扔掉主表中的第二个PK列,因为数据库中的其他表使用两列FK正确地引用这个主表。你读过我的答案和我的评论了吗?让数据库保持原样。别碰它。我知道你不能改变它。不要。只需将常量列设为PK的一部分,并将其映射为一个列,该列始终具有相同的常量值。将PK的另一部分(唯一变化的部分)映射为实体ID。我甚至给了您代码。试试看。