当前位置: 首页 > 知识库问答 >
问题:

Hibernate中的复合自引用外键映射

马德厚
2023-03-14

我有以下MySQL表。这里的思想是轨道和课程是主键。并且轨道中的一个航向可能依赖于“同一轨道”中的另一个航向,因此我在(track_id,depends_on_course_id)上创建了一个复合FK

CREATE  TABLE IF NOT EXISTS `testdb_1`.`track_course` (
`track_id` INT UNSIGNED NOT NULL ,
`course_id` INT UNSIGNED NOT NULL ,
`depends_on_course_id` INT UNSIGNED NULL ,
PRIMARY KEY (`track_id`, `course_id`) ,
INDEX `tc_tbl_dependent_crs_fk_idx` (`track_id` ASC, `depends_on_course_id` ASC) ,
CONSTRAINT `tc_tbl_dependent_crs_fk`
FOREIGN KEY (`track_id` , `depends_on_course_id` )
REFERENCES `testdb_1`.`track_course` (`track_id` , `course_id` ))
@Entity
@Table(name = "track_course", catalog = "testdb_1")
public class TrackCourse implements java.io.Serializable {

    private TrackCourseId id;
    private TrackCourse trackCourse;
    private Set<TrackCourse> trackCourses = new HashSet<TrackCourse>(0);

    public TrackCourse() {
    }

    public TrackCourse(TrackCourseId id, TrackCourse trackCourse) {
        this.id = id;
        this.trackCourse = trackCourse;
    }

    public TrackCourse(TrackCourseId id, TrackCourse trackCourse,
            Set<TrackCourse> trackCourses) {
        this.id = id;
        this.trackCourse = trackCourse;
        this.trackCourses = trackCourses;
    }

    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "trackId", column = @Column(name = "track_id", nullable = false)),
            @AttributeOverride(name = "courseId", column = @Column(name = "course_id", nullable = false)) })
    public TrackCourseId getId() {
        return this.id;
    }

    public void setId(TrackCourseId id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "track_id", referencedColumnName = "track_id", insertable = false, updatable = false),
            @JoinColumn(name = "depends_on_course_id", referencedColumnName = "course_id", insertable = false, updatable = false) })
    public TrackCourse getTrackCourse() {
        return this.trackCourse;
    }

    public void setTrackCourse(TrackCourse trackCourse) {
        this.trackCourse = trackCourse;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "trackCourse", cascade= CascadeType.ALL)
    public Set<TrackCourse> getTrackCourses() {
        return this.trackCourses;
    }

    public void setTrackCourses(Set<TrackCourse> trackCourses) {
        this.trackCourses = trackCourses;
    }

}
TrackCourse tc1 = new TrackCourse(new TrackCourseId(11, 1), null);
TrackCourse tc2 = new TrackCourse(new TrackCourseId(11, 2), tc1);
TrackCourse tc4 = new TrackCourse(new TrackCourseId(11, 4), tc1);

Set<TrackCourse> trackCourses = new HashSet<TrackCourse>();
trackCourses.add(tc2);
trackCourses.add(tc4);
tc1.setTrackCourses(trackCourses);
session.save(tc1); // I expect this statement to create three rows with following values

track_id    course_id   depends_on_course_id
11,         1,          null
11          2           1
11          4           1

但我在“depends_on_course_id column”中得到的结果都是空的,我猜getTrackCourse方法的映射有问题,但我不知道是什么?非常感谢任何帮助。

共有1个答案

史和泰
2023-03-14

getTrackCourse()似乎有空的cascadeType,因此默认情况下不会层叠任何操作。

顺便说一句。我建议使用生成键而不是自然键,这会使事情更加复杂。

 类似资料:
  • 问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身

  • 问题内容: 我在这里搜索,但未找到任何类似的主题,因此我发布了一个新问题。 我正在使用现有数据库上的Hibernate。我们不允许更改表的结构和数据。该应用程序正在从数据库读取数据,并根据某种逻辑迁移到另一个数据存储。 现在的问题是关于复合PK映射。例如 表A具有复合PK。 表B也有一个复合PK,此复合PK的一部分是A的PK,此处也用作FK。 我尝试了几种方法,但都无济于事。谁能告诉一个有效的Hi

  • 我的数据库是: 我们可以在Table2中为Table1中的1设置多行。 我的TABLE1实体是: 我的Table1Id类是: 我的TABLE2实体是: 我的Table2Id类是: 当我尝试启动我的tomcat时,我有以下错误: 我尝试使用引用列,主键连接列和许多其他东西,但是通过在互联网上阅读它,它可以解决数据库建模问题。我认为问题是主键和外键在2个表中具有相同的名称,但我可能是错的......我

  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?

  • 我有两个表:A和B,都有一个复合主键。表B的PK也是表a主键的外键。 当我试图获取映射表B的类的实例时,我得到了以下异常: org.hibernate.TypeMismatchException 这两个类都位于package:com.cairone.ejemple01.entities 完整的日志输出为: 2016-09-21 12:28:24.505错误8568--[main] O.S.Boot

  • 问题内容: 我有一个类似的问题,如下所示,但解决方案无法解决我的问题。 休眠复合主键包含复合外键,如何映射 我正在尝试加入2个表,每个表都有一个带有部分外键引用的复合主键。 在一个: 在BPK中: 上面的方法给我这个异常: 你能帮忙吗? 问题答案: 假设f1和F2唯一标识A并存在于APK中,则可以通过几种方式使用JPA 2.0的派生ID。最容易显示的是: 这里的关键点是B对A的引用控制了外键字段f