Как использовать отношения между таблицами в jpa - PullRequest
0 голосов
/ 09 октября 2018

Я изучаю jpa самостоятельно, используя интерактивные учебные пособия и пробуя возможные примеры, но теперь меня немного смущает вопрос о том, как использовать отношения между таблицами.У меня есть 3 класса с аннотацией @Entity, что означает, что jpa создаст таблицу на основе этих классов. У меня есть поле id в классах Student, Course, Booking, и они будут первичным ключом для соответствующих таблиц.Мне нужна помощь, в классе бронирования есть поля sid и cid, и я хочу, чтобы на них ссылались, такие как sid (Student.java) = sid (Booking.java) & cid (Course.java) = cid (Booking.java)) и сценарий, каждый студент может один или несколько заказов одного или нескольких курсов.Может кто-нибудь сказать мне, как и где я должен использовать @OnetoOne, @OnetoMany, @ManytoMany, @ManytoOne в моем коде.

Student.java

package com.testapp;

import java.util.List;
import javax.persistence.*;

@Entity
public class Student{

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int sid;
private String name;
private int salary;

//Getters and Setters....
  ..

public Student() {
    super();
}

public Student(int sid, String name, float salary) {
    super();
    this.sid = sid;
    this.name = name;
    this.salary = salary;
}

public Student(String name, float salary) {
    super();
    this.name = name;
    this.salary = salary;
}
}

Course.java

package com.testapp;

import java.util.List;
import javax.persistence.*;

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int cid;
    private String cname;
    private int price;

    //Getters and Setters....
      ..

    public Course() {
        super();
    }

    public Course(int cid, String cname, int price) {
        super();
        this.cid = cid;
        this.cname = cname;
        this.price = price;
    }
    public Course(String cname, int price) {
        super();
        this.cname = cname;
        this.price = price;
    }
}

Booking.java

package com.testapp;

import java.util.Set;
import javax.persistence.*;

@Entity
public class Booking {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int bid;
    private String date;
    private int sid;
    private int cid;

    //Getters and Setters....
      ..

    public Booking() {
        super();
    }

    public Booking(int bid, String date, int sid, int cid) {
        super();
        this.bid = bid;
        this.date= date;
        this.sid = sid;
        this.cid = cid;
    }

    public Booking(String date, int sid, int cid) {
        super();
        this.date = date;
        this.sid = sid;
        this.cid = cid;
    }
}

Спасибо ..

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Лучшим способом определения этих отношений в вашем случае будет Студент, и курс будет иметь отношение OneToMany к бронированию.И у бронирования будет много контактов со студентом и курсом

Student.java

@OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
public Set< Booking >   getBookings() {
    return bookings;
}

Course.java

@OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
public Set<Booking>   getBookings() {
    return bookings;
}

Booking.java

    @Entity
    public class Booking {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int bid;
    private String date;
    private Student student;
    private Course course;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "sid")
    public Student getStudent() {
       return student;
    }

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cid")
    public Course getCourse() {
       return course;
    }
    //Getters and Setters....
      ..

    public Booking() {
        super();
    }
}
0 голосов
/ 09 октября 2018

Вы не должны использовать первичные ключи других сущностей в JPA!

Используйте @ManyToOne и Student, а также Cource вместо sid и cid.

0 голосов
/ 09 октября 2018

Просто определите объект в своем классе, как пример ученика, включающего много Cource, затем вы можете определить свойство в классе ученика, как показано ниже

public class Student{
private List<Cource> cources;
}

, тогда orm обнаружит связь, но у вас также есть аннотации, такие как @OneToMant @ManyToMany в JPA

...