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