我有一些复杂的数据库结构,我想先解释一下。我们有以下表格:
Mandant (Id, Name)
Leistungsbereich (Id, Label)
Benutzer (Id, LoginName)
这里我们有两个关联表:
Mandant_Leistungsbereich (Id, MandantId, LeistungsbereichId)
Benutzer_Mandant_Leistungsbereich (Id, BenutzerId, MandantLeistungsbereichId)
主键始终是' Id'我认为列和外键是显而易见的。
对于前三个表,我有与Hibernate一起使用的相应Domain Java类。
要获取Leistungsbereich
的所有Mandant
项,我的Mandant
域类中包含以下代码:
@JoinTable(
name = "Mandant_Leistungsbereich",
joinColumns = {
@JoinColumn(
name = "MandantId"
)
},
inverseJoinColumns = {
@JoinColumn(
name = "LeistungsbereichId"
)
}
)
@ManyToMany( fetch = FetchType.LAZY )
private Set<Leistungsbereich> leistungsbereiche;
当我自动加载Mandant
时,Java Set中加载了所有Leitungsbereich
项。 Hibernate知道它必须在Mandant_Leistungsbereich
关联表中进行搜索,所以到目前为止这个工作正常。
现在出现了奇怪的部分。我还想为Benutzer
实现相同的目标,因为Benutzer
应该有Mandant_Leistungsbereich
个项目的列表(或更好说一组)。
所以我在Benutzer
班级做同样的事情:
@JoinTable(
name = "Benutzer_Mandant_Leistungsbereich",
joinColumns = {@JoinColumn( name = "BenutzerId" ) },
inverseJoinColumns = {@JoinColumn( name = "MandantLeistungsbereichId" ) }
)
@ManyToMany( fetch = FetchType.LAZY )
private Set<MandantLeistungsbereich> mandantLeistungsbereiche;
但是加载用户后会打印出以下错误:
org.hibernate.MappingException: Foreign key (FK_71hckf2bhqrp78gom71l6eq38:Benutzer_Mandant_Leistungsbereich [MandantLeistungsbereichId])) must have same number of columns as the referenced primary key (Mandant_Leistungsbereich [MandantId,LeistungsbereichId])
我真的不知道为什么hibernate认为Benutzer_Mandant_Leistungsbereich
表需要Mandant_Leistungsbereich
表的两个外键。在数据库和hibernate映射中,始终只有一个Id
列作为主键,因此没有复合键。为什么hibernate告诉我外键需要两列?