【发布时间】:2016-06-04 04:22:16
【问题描述】:
Hibernate 不允许我使用唯一字段“docket”进行连接表,无论我是否指定“referencedColumnName = “docket””(我认为这个属性的想法是告诉 Hibernate 使用哪个字段,以防它不是主键)。
数据库表:
student
---------------
id (PK) | docket (UNIQUE)
inscription
---------------
course_id | docket
inscription's PK is (course_id, docket)
course
---------------
id (PK)
使用以下配置会引发上述问题:
关于学生实体:
@ManyToMany
@JoinTable(
name="inscription",
joinColumns=@JoinColumn(referencedColumnName = "docket", name="docket"),
inverseJoinColumns=@JoinColumn(name="course_id", referencedColumnName = "id")
)
private List<Course> studentCourses;
关于课程实体:
@ManyToMany(mappedBy = "studentCourses")
private List<Student> students;
导致问题的原因是,在部署项目时,Hibernate 执行语句:
alter table public.inscription add constraint FKp625s5r1hmlggpgeq4x2nju91 foreign key (docket) references public.student
这(当然)是不正确的,因为它没有指定 docket 是一个唯一的字段。
它应该做的是:
alter table public.inscription add constraint FKp625s5r1hmlggpgeq4x2nju91 foreign key (docket) references public.student(docket)
但我不知道如何告诉它这样做。
有什么帮助吗? 提前致谢。
【问题讨论】:
-
referencedColumnName 通常适用于关系末尾有多个 PK 字段的情况,因此您可以将不同的 PK 列与等效列对齐(s) 在连接表中。我知道 JPA 规范中没有任何内容允许使用非 PK 字段进行加入;确定 JPA 提供者可以允许,但您的似乎不允许。
-
感谢您的评论!但是,据我所知,每个数据库表只能定义 PK,而表的其他 ID 需要定义为 UNIQUE。 PK 和 UNIQUE 都被数据库实现用作索引,但区别在于数据在数据库中的组织方式(它对 db 用户是透明的)。这就是为什么我认为使用 PK,JPA 文档指的是任何表的 ID(PK + UNIQUE 约束)。也许是指复合PK的一列,我误解了文档。
标签: java sql hibernate postgresql jpa