如何在实体中声明两个外键作为主键

时间:2019-06-18 13:19:32

标签: java database spring jpa

在我的春季代码中,我有两个表,分别是学生表和课程表。我想创建一个关系表“ takeCourse”。我将只有学生ID和课程ID。我可以在Java代码中创建带有两个主键的表,但是不能将它们声明为外键。

我尝试了此解决方案Two foreign keys as primary key,但没有解决,我认为其中有些缺失的部分。因此,我根据以下解决方案进行了尝试:

(学生实体具有ID,名称,姓氏) (课程实体具有ID,课程名称)

// 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作为pk的表。但结果是:

创建表take_course(cid int8不为null,sid int8不为null,  主键(cid,sid))

没有外键信息。

我希望它成为 创建表take_course(cid int8不为null,  sid int8不为null, 主键(cid,sid), 外键sid引用学生(id), foreigr关键CID参考课程(id))

有人可以看到我在哪里出问题了吗?

1 个答案:

答案 0 :(得分:1)

我试图回答你的问题。

TakeCourse(Java中的类以大写字母开头)是Course与Student之间的关系。

所以您的实体应如下所示:

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"></script>
<canvas id="NbTicketsChart" width="50" height="50"></canvas>
<script>
  var NbCanvas = document.getElementById("NbTicketsChart");

  Chart.defaults.global.defaultFontFamily = "Lato";
  Chart.defaults.global.defaultFontSize = 18;

  var densityData = {
      label: 'Nombre de tickets sur la semaine',
      data: [20, 25, 30, 25, 30, 35, 40],
      backgroundColor: '#336ca6'

  };
  var barChart = new Chart(NbCanvas.getContext('2d'), {
    type: 'bar',
    data: {
    labels: ["J-1", "J-2", "J-3", "J-4", "J-5", "J-6", "J-7"],
    datasets: [densityData]
  }});

  barChart.options.scales.yAxes[0] = {ticks: {min: 0, max: 100, stepValue: 20}}
</script>

请在此处找到有关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