【问题标题】:is there a way to share the composite primary key of a class in a many to one relationship?有没有办法以多对一的关系共享一个类的复合主键?
【发布时间】:2019-07-05 15:43:24
【问题描述】:

我有两个类 TempResult 和 Result 需要它们之间的多对一。 Tempresult 有一个复合键。 Result 还需要 TempResult 的复合键中的所有属性,除了一个作为其主键。

使用 TempResult 中包含的 @ManyToOne,如果在 @JoinColumn 中设置了 insertable=false 和 updatable=false,则表结构一切正常。但它不允许在 TempResult 表中创建新条目。如果不包含,则会出现重复列的错误。

这就是我的课程的样子。

我尝试不将可插入和可更新设置为 false,但随后列重复出现错误。

@Entity
@Table(name = "tempResult")
public class TempResult {

    @EmbeddedId
    private TempIdentity tempIdentity;

    @Convert(converter = BooleanConverter.class)
    @Column(name = "attendance",nullable = false)
    private boolean attendance;

    @Column(name = "marks")
    private int marks;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "registrationNo",insertable=false,updatable = false),
            @JoinColumn(name="courseId",insertable=false,updatable = false),
            @JoinColumn(name="year",insertable=false,updatable = false),
            @JoinColumn(name="semester",insertable=false,updatable = false)
    })
    Result result;


}
//Composite id class
@Embeddable
public class TempIdentity implements Serializable {

        @NotNull
        @Column(name = "registrationNo")
        private String registrationNo;

        @NotNull
        @Column(name = "courseId")
        private String courseId;

        @NotNull
        @Column(name = "year")
        private int year;

        @NotNull
        @Column(name = "semester")
        private int semester;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "userId",referencedColumnName = "userId")
        User user;
}

Result 表中需要除 userId 之外的所有属性。

@Entity
@Table(name="result")
public class Result {

    @EmbeddedId
    private ResultIdentity resultIdentity;

    @NotNull
    private int marks;
}

//结果表的复合键

@Embeddable
public class ResultIdentity implements Serializable {

    private String registrationNo;

    private String courseId;

    private int year;

    private int semester;


Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`rms_db`.`#sql-113c_95`, CONSTRAINT `FKa683jvhkm50n035ib6ojqlbu7` FOREIGN KEY (`registration_no`, `course_id`, `year`, `semester`) REFERENCES `result` (`course_id`, `registration_no`, `semeste)

我需要将数据插入到 TempResult 表中。但这会阻止。有人可以帮忙吗???

【问题讨论】:

    标签: mysql hibernate spring-boot spring-data-jpa


    【解决方案1】:

    我看到的一件事是 ResultIdentity 类没有为所有字段注释 @Column。可能必须以这种方式重写

    @Embeddable
    public class ResultIdentity implements Serializable {
    
    @Table("registration_no")
    private String registrationNo;
    
    @Table("course_id")
    private String courseId;
    
    @Table("year")
    private int year;
    
    @Table("semester")
    private int semester;
    

    如果没有@Table 注解,Hibernate 无法理解这些字段与列相关联。可以改一下代码重新测试一下吗?

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多