Как объявить два внешних ключа в качестве первичных ключей в сущности - PullRequest
0 голосов
/ 18 июня 2019

У меня есть две таблицы, которые являются студентом и курсом в моем весеннем коде.Я хочу создать таблицу отношений "takeCourse".У меня будет только идентификатор студента и идентификатор курса.Я могу создать таблицу с двумя первичными ключами в своем коде Java, но не могу объявить их как внешний ключ.

Я пробовал это решение Два внешних ключа в качестве первичного ключа , но это не такЯ думаю, что там есть некоторые недостающие части.Поэтому я попробовал это на основе этого решения:

(у сущности студента есть идентификатор, имя, фамилия) (у сущности курса есть идентификатор, имя курсора)

// This is embedded id:
@Embeddable
public class CompositeKey implements Serializable {
    public long getSid() {
        return sid;
    }

    public void setSid(long sid) {
        this.sid = sid;
    }

    public long getCid() {
        return cid;
    }

    public void setCid(long cid) {
        this.cid = cid;
    }

    @Column(name="sid")
    private long sid;

    @Column(name="cid")
    private long cid;
}

//This is takeCourse entity code
@Entity
@Table(name="takeCourse")
public class takeCourse implements Serializable {
    @EmbeddedId CompositeKey id;


    @ManyToMany
    @JoinColumn(name = "sid")
    public Student getStudent(StudentRepository repo){
        return repo.findById(id.getSid());
    }

    @ManyToMany
    @JoinColumn(name = "cid")
    public Course getStudent(CourseRepository repo){
        return repo.findById(id.getCid());
    }

}

Я ожидал создать таблицу с двумя fkкак пк.но результат таков:

создать таблицу take_course (cid int8 не ноль, sid int8 не ноль, первичный ключ (cid, sid))

информация о внешнем ключе отсутствует.

Я хочу, чтобы это было создание таблицы take_course (cid int8 не ноль, sid int8 не ноль, первичный ключ (cid, sid), иностранный ключ sid ссылается на ученика (id), foreigr ключ cid ссылается на курс (id))

Кто-нибудь может увидеть, где я ошибся?

1 Ответ

1 голос
/ 18 июня 2019

Я пытаюсь ответить на ваш вопрос.

TakeCourse (классы в Java начинаются с заглавной буквы) - это отношение между курсом и студентом.

Итак, ваша сущность должна выглядеть так:

@Entity
@Table(name="takeCourse")
public class TakeCourse implements Serializable {


    @EmbeddedId 
    private CompositeKey id;

    @MapsId    
    @ManyToOne
    @JoinColumn(name = "sid")
    private Student student;

    @MapsId        
    @ManyToOne
    @JoinColumn(name = "cid")
    private Course course;

    // getters and setters
}

Документацию по MapsId можно найти здесь:

https://docs.oracle.com/javaee/7/api/javax/persistence/MapsId.html

https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#identifiers-derived

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...