我正在尝试参考另一个表使用复合主键。我看到了很多主题,但没有答案适合我。
在我的数据库中,owner_id
未添加由外键正确创建的列。因此,即使员工不存在,我也可以添加新记录。我SQLLite
用作数据库
A类:
@Column(name = "filename", unique = true)
private String filename;
@EmbeddedId
private TimeSheetID id;
@MapsId("owner_id")
@JoinColumn(name = "owner_id", referencedColumnName = "employee_id")
@ManyToOne
private EmployeeeEntity employee;
Run Code Online (Sandbox Code Playgroud)
B级
public class TimeSheetID implements Serializable{
private static final long serialVersionUID = 7469844076039968866L;
@Column(nullable = false, name = "period")
private String period;
@Column(nullable = false, name = "owner_id")
private String ownerId;
// …
}
Run Code Online (Sandbox Code Playgroud)
C级
@Column(nullable = false)
public String getName() {
return name;
}
@Id
@Column(name = "employee_id")
public String getEmployeeID() {
return employeeID;
}
@Column(nullable = false)
public String getBusinessUnit() {
return businessUnit;
}
Run Code Online (Sandbox Code Playgroud)
你很亲近
不应在@MapsId
注释中使用列名,而应使用与该外键相对应的类字段名:
@MapsId("ownerId")
@ManyToOne
private EmployeeeEntity employee;
Run Code Online (Sandbox Code Playgroud)
同样,由于@Column
已经在@Embeddable
中指定了,因此无需再次指定。有referencedColumnName
作为你都指向目标id字段,这是在默认情况下持续提供choosen也是没有必要的。