首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用JPA注释Map<Entity,Entity>?

如何用JPA注释Map<Entity,Entity>?
EN

Stack Overflow用户
提问于 2021-02-14 15:40:37
回答 1查看 284关注 0票数 1

这个应用程序的栈:Spring MVCSpring DataJPAHibernate。有三个实体:studenttutortheme

主题

代码语言:javascript
复制
@Entity
@Table(name = "themes")
public class Theme {
    // fields omitted
}

学生

代码语言:javascript
复制
@Entity
@Table(name = "students")
public class Student {

    private Map<Theme, Tutor> tutors;
    // other fields omitted
}

Tutor

代码语言:javascript
复制
@Entity
@Table(name = "tutors")
public class Tutor {

    private Map<Theme, Student> students;
    // other fields omitted
}

为了保存student-tutor-theme关系,我希望使用这个表(PostgreSQL)

代码语言:javascript
复制
CREATE TABLE themes_students_tutors
(
    theme_id   INTEGER NOT NULL,
    student_id INTEGER NOT NULL,
    tutor_id   INTEGER NOT NULL,
    FOREIGN KEY (theme_id) REFERENCES themes (id) ON DELETE CASCADE,
    FOREIGN KEY (student_id) REFERENCES students (id) ON DELETE CASCADE,
    FOREIGN KEY (tutor_id) REFERENCES tutors (id) ON DELETE CASCADE
)

如何对实体中的tutorsstudents字段进行注释,因为它们的内容正确存在于此表中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-14 18:08:32

正如提到的@kolossus :使用@MapKeyJoinColumn1 1注释,使类(或映射字段)看起来如下(您可以忽略AbstractPersistable的扩展):

学生:

代码语言:javascript
复制
public class Student extends AbstractPersistable<Long> {

    @ManyToMany
    @JoinTable(name = "themes_students_tutors", joinColumns = {
            @JoinColumn(name = "student_id", referencedColumnName = "id") }, inverseJoinColumns = {
                    @JoinColumn(name = "tutor_id", referencedColumnName = "id") })
    @MapKeyJoinColumn(name = "theme_id")
    private Map<Theme, Tutor> tutors;

}

导师:

代码语言:javascript
复制
public class Tutor extends AbstractPersistable<Long> {

    @ManyToMany
    @JoinTable(name = "themes_students_tutors", joinColumns = {
            @JoinColumn(name = "tutor_id", referencedColumnName = "id") }, inverseJoinColumns = {
                    @JoinColumn(name = "student_id", referencedColumnName = "id") })
    @MapKeyJoinColumn(name = "theme_id")
    private Map<Theme, Student> students;

}

既然如此,这样的东西就会被创造出来:

代码语言:javascript
复制
Hibernate: create table students (id bigint not null, primary key (id))
Hibernate: create table themes (id bigint not null, primary key (id))
Hibernate: create table themes_students_tutors (tutor_id bigint not null, student_id bigint not null, theme_id bigint not null, primary key (student_id, theme_id))
Hibernate: create table tutors (id bigint not null, primary key (id))
Hibernate: alter table themes_students_tutors add constraint FKm5l4is34t5gs14p4skkv3aup7 foreign key (student_id) references students
Hibernate: alter table themes_students_tutors add constraint FK8o0mm5ywi0l4hdxi4lgw4dbnu foreign key (theme_id) references themes
Hibernate: alter table themes_students_tutors add constraint FKa0n6jvie0kmk0pmikcuvtepxh foreign key (tutor_id) references tutors

1:参见Javadoc documentation of @MapKeyJoinColumn中的其他一些样本

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66197034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档