我有一个使用三向连接表的地图的休眠(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])
如果我删除注释installationConfigurations
并使其瞬态,错误就会消失。
我很困惑为什么当@Id 明确定义一个简单的键时它认为 SiteTypeInstallation 有一个复合键,并且双重困惑为什么它只选择这两个列。知道为什么会这样吗?JBoss (5.0 EAP) + Hibernate 是否有可能在服务器重新启动和代码重新部署时以某种方式记住主键的错误想法?
在此先感谢,-拉尔斯