mysql - 有没有办法在多对一关系中共享类的复合主键?

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

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

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

这就是我的类(class)的样子。

我尝试不将 insertable 和 updatetable 设置为 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;
}

结果表中需要除 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 表中。但这阻止了。有人可以帮忙吗???

最佳答案

我看到的一件事是 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 就无法理解这些字段链接到列。您可以更改代码重新测试吗?

关于mysql - 有没有办法在多对一关系中共享类的复合主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906013/

相关文章:

Mysql 查询用于转换货币并按 maxprice 排序

mysql - 如何使用 Snap 的 MysqlSimple snaplet 连接到 MySQL

c++ - MFC 功能包错误?基于功能区的 GUI 在 hibernate ( sleep 模式)后不恢复

java - 从 JpaRepository 检索对象后,延迟加载在简单的 Hibernate/Spring 启动示例中不起作用

mysql - 更新表中的重复值

mysql - SQL 中的移动平均线

java - 如何在 Hibernate 中对相同的两个表之间的两个一对一关系进行建模?

java - 哪个 JAR 包含 org.springframework.orm.hibernate.HibernateTransactionManager?

Java Spring Boot 不会从 application.yml 中获取变量

java - 如何为 Spring Boot 服务器初始化程序编写 Mockito 测试