Hibernate の EntityManager が起動し、エンティティのマッピングを検証しているときに問題が発生しています。私がドラフトできる最も簡単な言葉で言えば、次の 4 つのクラスがあります。
@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 を強制的に検証する、私が見逃している明らかな何かがありますか? または、外部キーを検証せずに、私が正しく行ったことを信頼するようにするには?
補足として、クラスを 2 つの異なる識別子設定で 2 回マップする正当な理由がないことはわかっています。私の場合、同じデータベースで動作するコードの 2 つの異なるプロジェクトのマージが原因です。1 つは読み取り専用で使用されるため、この異常なマッピングを回避できます。残念ながら、両方のコード ベースには、クラスのバージョンにラップされた大量のコードが含まれており、リファクタリングは大がかりな作業になるでしょう。