【问题标题】:How to declare two foreign keys as primary keys in an entity如何将两个外键声明为实体中的主键
【发布时间】:2019-11-01 03:48:27
【问题描述】:

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

我尝试了这个解决方案Two foreign keys as primary key,但没有成功,我认为那里有一些缺失的部分。所以我根据这个解决方案尝试了这个:

(学生实体有 id、name、surname) (课程实体有id, coursename)

// 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 not null,sid int8 not null, 主键(cid,sid))

没有外键信息。

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

有没有人能看出我哪里出错了?

【问题讨论】:

  • 这不是有效的代码。您不能将 repo 传递给 getter。另外,这不是多对多而是多对一的关系。
  • @column 注解下应该写什么代码?

标签: java database spring jpa


【解决方案1】:

我试着回答你的问题。

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

所以你的实体应该是这样的:

@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

【讨论】:

  • 先生,当映射 MapsId 错误时,我在引用的实体上得到 Unexpected identifier type 你知道吗..
  • 你能发布堆栈跟踪吗?
  • 我发布了先生,请您检查一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2012-05-21
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2023-04-11
  • 2011-07-20
相关资源
最近更新 更多