我有两个类TempResult和Result,它们之间需要多对一。 Tempresult具有复合键。 Result还需要TempResult组合键中的所有属性,但其中一个必须为其主键。
如果在@JoinColumn中设置了insertable = false和updatable = false,则在TempResult中包含@ManyToOne时,表结构就很好。但是它不允许在TempResult表中进行新的输入。如果不包含它,则出现错误,提示重复列。
这就是我的班级样子。
我尝试不将insertable和updatable设置为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/