我有一个包含复合主键的主表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
答案 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
属性来指定引用的列名称。