2

三方向結合テーブルを使用したマップの 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 が、サーバーの再起動やコードの再デプロイの際に主キーの誤った考えを何らかの形で覚えている可能性はありますか?

前もって感謝します、-ラース

4

0 に答える 0