Hibernate MapKeyManyToMany дает составной ключ там, где его нет - PullRequest
2 голосов
/ 16 июня 2010

У меня есть 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)

Ключевой объект, который имел первичный ключ из трех столбцов в базе данных, но теперь он переопределен как:

@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]) * 101 *

Если я уберу аннотации на installationConfigurations и сделаю их кратковременными, ошибка исчезнет.

Я очень смущен, почему он думает, что SiteTypeInstallation вообще имеет составной ключ, когда @Id четко определяет простой ключ, и вдвойне смущен, почему он выбирает именно эти два столбца. Есть идеи, почему это происходит? Возможно ли, что JBoss (5.0 EAP) + Hibernate каким-то образом помнит ошибочное представление о первичном ключе при перезапусках сервера и повторном развертывании кода?

Заранее спасибо, -Lars

...