三方向結合テーブルを使用したマップの Hibernate (3.3.1) マッピングがあります。
@Entity
public class SiteConfiguration extends ConfigurationSet {
@ManyToMany
@MapKeyManyToMany(joinColumns=@JoinColumn(name="SiteTypeInstallationId"))
@JoinTable(
name="SiteConfig_InstConfig",
joinColumns = @JoinColumn(name="SiteConfigId"),
inverseJoinColumns = @JoinColumn(name="InstallationConfigId")
)
Map<SiteTypeInstallation, InstallationConfiguration>
installationConfigurations = new HashMap<SiteTypeInstallation, InstallationConfiguration>();
...
}
基礎となるテーブル (Oracle 11g の場合) は次のとおりです。
Name Null Type
------------------------------ -------- ----------
SITECONFIGID NOT NULL NUMBER(19)
SITETYPEINSTALLATIONID NOT NULL NUMBER(19)
INSTALLATIONCONFIGID NOT NULL NUMBER(19)
キー エンティティは、データベースに 3 列の主キーがありましたが、現在は次のように再定義されています。
@Entity
public class SiteTypeInstallation implements IdResolvable {
@Id
@GeneratedValue(generator="SiteTypeInstallationSeq", strategy= GenerationType.SEQUENCE)
@SequenceGenerator(name = "SiteTypeInstallationSeq", sequenceName = "SEQ_SiteTypeInstallation", allocationSize = 1)
long id;
@ManyToOne
@JoinColumn(name="SiteTypeId")
SiteType siteType;
@ManyToOne
@JoinColumn(name="InstalationRoleId")
InstallationRole role;
@ManyToOne
@JoinColumn(name="InstallationTypeId")
InstType type;
...
}
このテーブルには、主キー 'Id' と、他の各列の外部キー制約 + インデックスがあります。
Name Null Type
------------------------------ -------- ----------
SITETYPEID NOT NULL NUMBER(19)
INSTALLATIONROLEID NOT NULL NUMBER(19)
INSTALLATIONTYPEID NOT NULL NUMBER(19)
ID NOT NULL NUMBER(19)
何らかの理由で、Hibernate はマップのキーが複合キーであると考えていますが、複合キーではないため、次のエラーが表示されます。
org.hibernate.MappingException: 外部キー (FK1A241BE195C69C8:SiteConfig_InstConfig [SiteTypeInstallationId])) には、参照される主キー (SiteTypeInstallation [SiteTypeId,InstallationRoleId]) と同じ数の列が必要です
注釈を削除しinstallationConfigurations
て一時的にすると、エラーは消えます。
@Id が単純なキーを明確に定義しているのに、なぜ SiteTypeInstallation に複合キーがあると考えるのか、非常に混乱しています。なぜこれが起こるのか分かりますか?JBoss (5.0 EAP) + Hibernate が、サーバーの再起動やコードの再デプロイの際に主キーの誤った考えを何らかの形で覚えている可能性はありますか?
前もって感謝します、-ラース