当 Hibernate 的 EntityManager 启动并验证实体的映射时,我遇到了一个问题。用我能起草的最简单的术语来说,我有以下四个类:
@Entity
@Table(name="abc_rule")
public class Rule {
@Id
@Column(name="id")
private Integer id;
@ManyToOne
private RuleType ruleType;
}
@Entity
@Table(name="abc_rule_type")
@IdClass(RuleTypeKey.class)
public class RuleType {
@Id
private String typeCode;
@Id
private String otherCode;
@Column(name="descr")
private String description;
}
public class RuleTypeKey {
@Id
@Column(name="type_cd")
private String typeCode;
@Id
@Column(name="other_cd")
private String otherCode;
}
@Entity
@Table(name="abc_rule_type")
public class RuleTypeSimple {
@Id
@Column(name="id")
private Integer id;
@Column(name="type_cd")
private String typeCode;
@Column(name="other_cd")
private String otherCode;
@Column(name="descr")
private String description;
}
当 Hibernate 启动时,我得到以下异常:
外键 (FK4AD4C4B924F958E2:abc_rule [ruleType_type_cd,ruleType_other_cd]) 的列数必须与引用的主键 (abc_rule_type [id]) 相同
如果我暂时将 @Table 注释重命名为RuleTypeSimple
,"abc_rule_type_123"
那么 Hibernate 将按预期验证并使用映射。在我看来,Hibernate 是根据表名而不是根据被引用的实际类的设置来验证外键映射。
我在这里遗漏了什么明显的东西会迫使 Hibernate 基于类进行验证吗?或者让它甚至不验证外键,只相信我做对了?
作为旁注,我知道没有充分的理由让类使用两个不同的标识符设置映射两次。在我的情况下,它导致了两个不同项目的代码合并在同一个数据库上。一个以只读方式使用,因此可以摆脱这种不寻常的映射。不幸的是,这两个代码库都有大量的代码围绕着他们的类版本,重构将是一项艰巨的任务,我希望暂时可以避免。